我有一个课,其休息点如:
@Path("/myPath/myFunction")
public class MyClass {
@Get
@Path("someSpecificFunction")
public Response getSomeData(@QueryParam("myVar") String myVar) {
MyObject myObject = new MyObject();
JsonObject response = myObject.getJson(myVar);
return Response.ok(response.toString()).build();
}
}
我想为getSomeData
编写单元测试,并想模拟myObject.getJson
调用。
最佳方法是什么?
如果可能,我想避免在@PrepareForTest
上使用MyClass
。
我尝试将MyObject
实例的创建转换为静态方法,例如:
protected static MyObject createMyObject() {
return new MyObject();
}
但是对于模拟或静态方法,PowerMockito
仍需要@PrepareForTest
。
我该如何解决?
您可以使用PowerMocktio
使用whenNew()
,步骤
MyClass
whenNew
,这意味着当实例化一个新对象时,使用此模拟对象
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class ExampleClassTest {
private MyClass myClass;
@Before
public void setUp() {
myClass = new MyClass();
}
@Test
public void shouldDoSomething() {
MyObject mocked = mock(MyObject.class);
PowerMockito.whenNew(String.class).withNoArguments().thenReturn(mocked);
assertEquals("mocked", myClass.getString());
}
另一种选择是更改类的设计并让测试注入MyObject
类似
public MyClass {
MyObject myObject = new MyObject()
public method(){
...
}
}
MyClassTest {
@Test
public test() {
MyClass myClass = new MyClass();
myClass.myObject = mock(MyObject.class);
//test code
}
}
这简化了可测试性,可以与任何框架一起使用,如果您有DI框架也将有助于引入它。