如何模拟在要测试的方法内部创建的对象的方法调用

问题描述 投票:0回答:2

我有一个课,其休息点如:

@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

我该如何解决?

java junit mockito powermockito
2个回答
0
投票

您可以使用PowerMocktio使用whenNew()

,步骤

  1. PrepareForTest MyClass
  2. 使用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());
    }

0
投票

另一种选择是更改类的设计并让测试注入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框架也将有助于引入它。

© www.soinside.com 2019 - 2024. All rights reserved.