在@Spy上调用原始方法,然后引发异常

时间:2019-03-22 00:29:29

标签: spring-boot mockito spring-test spring-boot-test

我有一个@Transactional方法,我必须测试该方法在调用事务后是否失败,例如:

@Service
public class MyService {
    @Transactional
    public void myMethod() {
        // [...] some code I must run in my test, and throw an exception after it has been called but before the transaction is commited in order for the transaction to be rolled back
    }
}

这是测试班:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyApp.class)
public class MyServiceTest {

    @SpyBean
    private MyService myService;

    @Test
    public void testMyMethod() {
        doAnswer(/* some code which would call the real method, then throw an exception in order to cancel the transaction */)
        .when(myService).myMethod();
        // [...] other code that test other services when that service failed in the transaction but after its real method has been correctly executed
    }
}

您能告诉我在测试的/* ... */部分中放入什么代码吗?

1 个答案:

答案 0 :(得分:1)

您可以简单地使用invocation.callRealMethod(),然后在throw内使用doAnswer一些异常:

@Test
public void testMyMethod() {
    doAnswer(invocation -> {
        invocation.callRealMethod();
        throw new IllegalStateException();
    })
    .when(myService).myMethod();
    // [...] other code that test other services when that service failed in the transaction but after its real method has been correctly executed
}