我有以下两个课程
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尝试了一些模式,但没有成功。
请提出一些好的建议。
答案 0 :(得分:3)
我认为你需要Mockito扩展Powermock,因为它需要更改类的字节码。有关如何操作的说明,请参阅Mock construction of new objects。
主要工具可能是expectNew
或createMockAndExpectNew
。 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);
通过这种设计,您可以在两个班级之间松散,并且您的测试清楚地显示了它们之间的关系。