我有一个@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
}
}
您能告诉我在测试的/* ... */
部分中放入什么代码吗?
答案 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
}