使用内部对象的Java单元测试



我有以下两个类

public class SampleTest {
   public Integer getResult() {
     Test1 test1 = new Test1(5);
     Integer j = doSomeThing(test1);
     return j;
   }
   public Integer doSomeThing(Test1 test1){
     Integer p = test1.getValue();
     return p+1;
   }
}
public class Test1 {
  Integer i;
  Test1(Integer i){
    this.i = i*2;
  }
  Integer getValue(){
    return i;
  }

我想对SampleTest getResult()进行单元测试,但想模拟Test1(),以便它返回我在UnitTests中设置的任何值。我不能改变这些类中的任何一个。

我尝试了几个模式使用Mockito,但没有成功。

请指教。

我认为您需要mockit扩展Powermock,因为它需要更改类的字节码。参见模拟新对象的构造,了解如何这样做。

主要的工具可能是expectNewcreateMockAndExpectNew。Ex(未经测试,可能遗漏了什么,但大致方向):

Test1 mockedTest1 = createMockAndExpectNew(Test1, any(Integer));
expect(mockedTest1.getValue()).andReturn(42);
replayAll(); // setup all objects maintained by Powermock.
assertEquals(new SampleTest().getResult(), 43);

您绝对可以将Mockito与当前拥有的类一起使用。我建议你为SampleTest添加一个构造函数,在这个构造函数中你传递一个test1实例:

public SampleTest(Test1 test1) {
    this.test1 = test1;
}

那么你的getResult方法可以使用这个Test1客户端:

public Integer getResult() {
    Integer j = doSomeThing(this.test1);
    return j;
}

最后,您可以模拟test1实例并使其返回您想要的任何内容:

Test1 test1 = Mockito.mock(Test1.class);
Mockito.when(test1.getValue()).thenReturn(42);
SampleTest sampleTest = new SampleTest(test1);
Assertions.assertThat(sampleTest.getResult()).isEqualTo(43);

使用这种设计,您可以在两个类之间松散耦合,并且您的测试可以清楚地显示它们之间的关系。

相关内容

  • 没有找到相关文章

最新更新