Android 如何使用PowerMock模拟静态方法的回调应答?

Android 如何使用PowerMock模拟静态方法的回调应答?,android,powermock,Android,Powermock,我需要模拟一些静态方法,到目前为止还不错,可以这样做: @RunWith(PowerMockRunner.class) @PrepareForTest({DataService.class}) public class PlayersAllViewModelTest { // mock objects private PlayersAllContextHandler mContextHandler; private PlayersAllAdapter mAdapter; @Before pu

我需要模拟一些静态方法,到目前为止还不错,可以这样做:

@RunWith(PowerMockRunner.class)
@PrepareForTest({DataService.class})
public class PlayersAllViewModelTest {

// mock objects
private PlayersAllContextHandler mContextHandler;
private PlayersAllAdapter mAdapter;

@Before
public void setUp() throws Exception {

    mockStatic(DataService.class);

    //define mocks
    mContextHandler = mock(PlayersAllContextHandler.class);
    mAdapter = mock(PlayersAllAdapter.class);

}

@Test
public void check_init_requests_are_done() throws Exception {

    // create instance of viewmodel
    new PlayersAllViewModel(mContextHandler, mAdapter);

    // check dataservice is requested for method 'getAllPlayers()'
    PowerMockito.verifyStatic();
    DataService.getAllPlayers(any(DataServiceCallback.class));

}
    // define mock answer
    doAnswer(new Answer<MyCallback<String>>() {
        @Override
        public MyCallback answer(InvocationOnMock invocation) throws Throwable {
            MyCallback<Player> callback = (MyCallback<Player>) invocation.getArguments()[0];
            callback.onFailure(new UnsupportedOperationException());
            return null;
        }
    }).when(>>mocked class instance<<).myTestMethod(any(MyCallback.class));
我需要测试回调中应答的给定响应(success()/failure())的行为。通常的做法如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest({DataService.class})
public class PlayersAllViewModelTest {

// mock objects
private PlayersAllContextHandler mContextHandler;
private PlayersAllAdapter mAdapter;

@Before
public void setUp() throws Exception {

    mockStatic(DataService.class);

    //define mocks
    mContextHandler = mock(PlayersAllContextHandler.class);
    mAdapter = mock(PlayersAllAdapter.class);

}

@Test
public void check_init_requests_are_done() throws Exception {

    // create instance of viewmodel
    new PlayersAllViewModel(mContextHandler, mAdapter);

    // check dataservice is requested for method 'getAllPlayers()'
    PowerMockito.verifyStatic();
    DataService.getAllPlayers(any(DataServiceCallback.class));

}
    // define mock answer
    doAnswer(new Answer<MyCallback<String>>() {
        @Override
        public MyCallback answer(InvocationOnMock invocation) throws Throwable {
            MyCallback<Player> callback = (MyCallback<Player>) invocation.getArguments()[0];
            callback.onFailure(new UnsupportedOperationException());
            return null;
        }
    }).when(>>mocked class instance<<).myTestMethod(any(MyCallback.class));
//定义模拟答案
doAnswer(新答案){
@凌驾
公共MyCallback应答(InvocationMock调用)抛出Throwable{
MyCallback callback=(MyCallback)invocation.getArguments()[0];
onFailure(新的UnsupportedOperationException());
返回null;
}

}).什么时候(>>模拟类实例这是一个选项吗?首先,改进您的设计并正确处理静态内容?@GhostCat这不是一个真正的选项,因为我想解耦依赖项。要将对象实例设置为方法参数,这就是我开始的地方,我想去掉这些硬编码的依赖项。顺便说一下,我认为仅仅为了能够测试/模拟对象的行为而将对象的实例作为方法参数传递是不好的实现模式。我想必须有另一个处理选项…!?所以硬编码类名是不耦合的?您可能不会将该对象作为参数传递,但例如,在类中有一个字段并使用dependency注入。为需要调用的功能提供一个接口,并选择使用多态性…这是很好的OOP。静态调用不太多。这是一个选项吗?首先,改进设计并正确处理静态内容?@GhostCat这不是一个选项,因为我想解耦依赖项。设置一个对象的实例作为方法参数,这就是我开始和我想摆脱这些硬编码依赖关系的地方。顺便说一句,我认为仅仅为了能够测试/模拟对象的行为而将对象的实例作为方法参数来传递不是一个好的实现模式。我想必须有另一个处理选项…!?所以硬编码类名不耦合?您可能不会将该对象作为参数传递,但例如,在您的类中有一个字段并使用依赖项注入。为需要调用的功能提供一个接口,并选择使用多态性…这是很好的OOP。静态调用不太多。