我有以下两个类
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,因为它需要更改类的字节码。参见模拟新对象的构造,了解如何这样做。
主要的工具可能是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);
您绝对可以将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);
使用这种设计,您可以在两个类之间松散耦合,并且您的测试可以清楚地显示它们之间的关系。