嘿我正在使用Mockito和TestNG为一个正在对服务进行大量外部调用的类编写单元测试,我实际上对此很新,因此我似乎在网上留下了很少的文档对于我的确切问题。
我的测试基本上是这样的
@Test
public class ClassToTestTest{
@Mock
private Object1 object1;
@Mock
private Object2 object2;
@InjectMocks
private ClassToTest classToTest;
public void test1(){
classToTest.methodToTest();
}
...
...
}
实际课程如下
import FinalClass;
public class ClassToTest{
private Object1 object1;
private Object2 object2;
public void methodToTest(){
object2 = FinalClass.getObject2();
...
...
}
...
...
}
我只需要FinalClass.getObject2()来返回我在Test中创建的Object2的模拟,我知道我可以使用PowerMock模拟FinalClass,但是我还没有得到如何在classToTest中注入它我创建了,所以当我从我的测试对象2运行classToTest.methodToTest()时,我的模拟实现被初始化。
提前致谢!
答案 0 :(得分:4)
您希望使用PowerMockito模拟最终的静态类时,缺少注释@PrepareForTest和mockStatic()的使用。我想你可能会感到困惑的是,你正在处理一个final static
类而不仅仅是一个final
类,所以还需要注意一些额外的模拟调用。
鉴于这些实施类
/*
The final static class that's giving you all the mocking grief
*/
public final class FinalStaticClass {
// this object instance "will not" be returned when we mock() the class
private static MyObject obj = new MyObject();
public static MyObject getMyObject() {
return obj;
}
}
/*
A simple value object used by MyClass
*/
public class MyObject {
}
/*
The class you wish to test
*/
public class MyClass {
private MyObject obj;
public void methodToTest() {
obj = FinalStaticClass.getMyObject();
// do something
}
public MyObject getMyObject() {
return obj;
}
}
确保在项目中包含powermock-mockito-1.4.10-full.jar
,然后您可以使用此测试类
import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import ...
@RunWith(PowerMockRunner.class)
@PrepareForTest(FinalStaticClass.class)
public class MyClassTest{
@Mock
MyObject expectedObject;
@InjectMocks
MyClass myClass = new MyClass();
@Test
public void test1(){
// mock all static methods
mockStatic(FinalStaticClass.class);
when(FinalStaticClass.getMyObject()).thenReturn(expectedObject);
// execute the method under test
myClass.methodToTest();
assertEquals(expectedObject, myClass.getMyObject());
}
}
您可以看到expectedObject
是您在测试中创建的模拟,而不是从FinalStaticClass返回的实现