用内部对象进行Java单元测试

时间:2015-08-06 00:40:15

标签: java unit-testing mockito

我有以下两个课程

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()进行单元测试,但是我想在Mock Test1()里面这样做,这样我就可以返回我在UnitTests中设置的任何值。我无法改变这些课程。

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

请提出一些好的建议。

2 个答案:

答案 0 :(得分:3)

我认为你需要Mockito扩展Powermock,因为它需要更改类的字节码。有关如何操作的说明,请参阅Mock construction of new objects

主要工具可能是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);

答案 1 :(得分:1)

你绝对可以将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);

通过这种设计,您可以在两个班级之间松散,并且您的测试清楚地显示了它们之间的关系。