这里没有想要的交互例外



我正在为我的Spring MVC控制器编写测试。 我有一个组织。Mockito.exception.verifications.NoInteractionWant异常,具有以下堆栈跟踪:

这里不需要交互: -> at com.test.testInsertUtente.testInserimentoUtente(TestInsertUtente.java:124) 但发现这种互动: -> at com.test.UtenteForm.insertUtente(UtenteForm.java:149)

为什么?


public class TestInsertUtente {
private MockMvc mockMvc;
@Mock
private UtenteService utenteService;
@InjectMocks
private UtenteForm utenteForm;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(utenteService.insertUtente(isA(Utente.class))).thenReturn(new Utente("utente.test","utente","test","utente@test.com","test",0));
this.mockMvc = MockMvcBuilders.standaloneSetup(utenteForm).build();
}
@Test
public void testInserimentoUtente() throws Exception {
mockMvc.perform(post("/all/utente/form/insert/${action}","resta")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("utente", "utente.test")
.param("nome", "utente1")
.param("cognome", "test")
.param("email", "utente@test.com")
.param("password", "test")
.param("statoRecord", "0")
.sessionAttr("utente", new Utente())
).andExpect(status().isMovedTemporarily())
.andExpect(view().name("redirect:/web/all/utente/form/utente.test/modifica"))
.andExpect(redirectedUrl("/web/all/utente/form/utente.test/modifica?insert=true"))
.andExpect(model().size(2))
.andExpect(model().attribute("insert", equalTo(true)));
ArgumentCaptor<Utente> formObjectArgument = ArgumentCaptor.forClass(Utente.class);
verify(utenteService, times(1)).insertUtente(formObjectArgument.capture());
verifyNoMoreInteractions(utenteService);
}
}

很难说为什么会这样...

verifyNoMoreInteractions(utenteService);

。失败,因为我们看不到 (a) 测试用例的其余部分和 (b) 控制器代码。也许您的控制器调用该方法两次?

但是,测试的其他一些方面可以清理,这些更改可能会使verifyNoMoreInteractions多余。

您的测试对同一呼叫同时使用whenverifyutenteService.insertUtente()

在您的setUp()中,您告诉 Mockito 在使用任何Utente实例调用new Utente("utente.test","utente","test","utente@test.com","test",0)时返回它。但是,您没有利用此期望,即您不会断言此 Utente 实例已返回或以其他方式在您的控制器中使用。

然后,在testInserimentoUtente()中,验证是否调用了utenteService.insertUtente(),并捕获了在该调用中传递的参数,但不对该捕获的参数进行任何断言。

我建议应该有when期望或verify断言,具体取决于您的控制器如何处理来自utenteService.insertUtente()的响应,但是您不需要when期望和verify断言。如果你清楚地确定了你对utenteService.insertUtente()的期望,那么我怀疑不再需要对verifyNoMoreInteractions的呼吁。

我遇到了类似的问题。 就我而言,我试图嘲笑EmailService. 在模拟电子邮件发送部分并添加Mockito.verifyNoMoreInteractions(emailService). 我得到了例外No interactions wanted here.

调试后发现异常中打印的消息是错误的,但存在交互。 就我而言,EmailService有 3 种方法,2 种public和 1 种private. 测试用例试图ArgumentCapturepublic方法并对其进行verifyEmailService调用的public方法在内部调用private方法。 我通过在NoMoreInteractions.java::verify()MockitoLibrary中添加一个breakpoint来解决这个问题。

breakpoint显示,public法有2interactionsprivate法有2interactions。 为了使测试通过Mockito.verifyNoMoreInteractions(emailService),我做了以下 2 项更改。

  • 将私有方法更改为公共方法
  • 添加verify(emailService,times(2)).publicTurnedPrivateMethod()验证。

也就是说,测试通过了。 希望它能帮助他人

我正在使用MockitoLibrary-2.23.4jUnit-4.12库。 不确定此问题是否已在最新版本的mockito库中修复。

相关内容

  • 没有找到相关文章

最新更新