2017-07-07 54 views
0

首先,我的设置是RXJava 1,2改造和我使用的Java 7接收UnfinishedStubbingException的Mockito为doNothing.when子句中的Android单元测试

我有一个方法,当它被调用时,将设置原子布尔值为true。

该方法然后调用翻新API。

完成后,超时等...原子布尔重置为false。

因此,我想统一测试,当我调用我的方法时,原子布尔值设置为true。

所以,我做到以下几点:

assertFalse(orderUseCase.isOrderInProcess()); 

    orderUseCase.execute(id, orderWrapper, ts); 

    assertTrue(orderUseCase.isOrderInProcess()); 

测试的布尔是假的。 执行我的用例 测试布尔值是否为真。

现在,为了进行最后的测试,我需要确保API不执行任何操作时,它被称为(execute方法将调用改造API。

要尝试和doNothing我使用的是以下行我的测试案例的开始

doNothing().when(orderAPI.orderComplete(anyString(), any(OrderWrapper.class))); 

但是我收到以下错误:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at com.tfds.xms.unit_test.SingleTest.TestAtomicBooleanLocked(SingleTest.java:90) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed 

从阅读,而其他人也有类似的问题,ANSW ers建议他们的'when'行称为另一个Mock(我不相信我在做),或者他们没有完成我已经完成的'PrepareForTest'步骤。不过,我想知道我的prepareForTest部分是否正确或不...

顺便说一句,我明白,错误指出我添加'thenReturn',但这将意味着API'做'的东西,会从而导致原子布尔再次解锁,这不是我想要的。

任何帮助,非常感谢。

我的全面测试的情况是:

@RunWith(TestRunner.class) 
@PrepareForTest({OrderApiService.class, OrderUseCase.class}) 
public class SingleTest { 

    @Rule 
    public RxJavaResetRule pluginsReset = new RxJavaResetRule(); 

    private OrderApiService orderAPI; 
    private OrderUseCase orderUseCase; 
    private OrderRepository orderRepository; 

    @Mock App app; 

    @Before 
    public void setUp() { 

     orderAPI = mock(OrderApiService.class); 

     orderRepository = new OrderRepository(app, orderAPI); 

     orderUseCase = new OrderUseCase(orderRepository); 

    } 

    @Test 
    public void TestAtomicBooleanLocked() throws Exception { 

     doNothing().when(orderAPI.orderComplete(anyString(), any(OrderWrapper.class))); 

     String id = "5"; 

     Order order = new Order(); 

     OrderWrapper orderWrapper = new orderWrapper(order); 

     TestSubscriber<GenericResponse> ts = new TestSubscriber<GenericResponse>(); 

     assertFalse(orderUseCase.isOrderInProcess()); 

     orderUseCase.execute(id, orderWrapper, ts); 

     assertTrue(orderUseCase.isOrderInProcess()); 

    } 
} 

回答

2

doNothing()方法从Mockito的工作方式有些不同,那么独立when()方法。你应该罚款只需按下方法调用了.doNothing()这样的:

doNothing().when(orderAPI) 
    .orderComplete(anyString(), any(OrderWrapper.class)); 

快乐测试!

+0

嗨。谢谢您的回答。在解决我的问题方面,是的,这是做到了这一点,并且感谢你,但是......然后,它将我引向一个不同的问题。由于这是一个API调用,它会返回一些东西,所以我不能在这种情况下使用doNothing?有另一种方法吗? org.mockito.exceptions.base.MockitoException: 只有void方法才可以没有()! (): doNothing()。 (模拟) doThrow(new RuntimeException()) 。someVoidMethod(); 上面的意思是: someVoidMethod()第一次不做任何事,但第二次调用异常时抛出异常 – greysqrl

+0

我可以看到'when(spy.myMethod())。thenReturn(null)'似乎是方法,但..我可以在上面使用我的API调用吗? – greysqrl

相关问题