【问题标题】:No interactions wanted here exception这里不需要交互异常
【发布时间】:2017-09-05 11:10:50
【问题描述】:

我正在为我的 Spring MVC 控制器编写测试。 我得到一个 org.Mockito.exception.verifications.NoInteractionWanted 异常,带有这个堆栈跟踪:

这里不需要交互: -> 在 com.test.TestInsertUtente.testInserimentoUtente(TestInsertUtente.java:124) 但发现了这种互动: -> 在 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);

}
}

【问题讨论】:

    标签: spring testing junit controller mockito


    【解决方案1】:

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

    verifyNoMoreInteractions(utenteService);
    

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

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

    您的测试同时使用 whenverify 进行同一个调用:utenteService.insertUtente()

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

    然后,在 testInserimentoUtente() 中,您验证 utenteService.insertUtente() 被调用,并且您捕获在该调用中传递的参数,但您不对捕获的参数做出任何断言。

    我建议应该有 when 期望或 verify 断言,具体取决于您的控制器对来自 utenteService.insertUtente() 的响应所做的事情,但是您不需要 both @987654334 @expectation 和 verify 断言。如果您清楚地建立了对utenteService.insertUtente() 的期望,那么我怀疑将不再需要致电verifyNoMoreInteractions

    【讨论】:

    • 谢谢,之后添加验证,错误就消失了。非常可怕的海事组织。你可以找几个小时来解决这个问题。有时我只是想要一个模拟来返回一些东西,测试框架不应该为我决定我需要验证什么。它也没有告诉你问题是什么。换句话说,零意义,这让我想为浪费时间的实现这种 api 的开发人员扇耳光。
    【解决方案2】:

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

    调试后发现异常中打印的消息是错误的,但是有交互。在我的例子中,EmailService 有 3 个方法,2 个 public 和 1 个 private。测试用例试图ArgumentCapturepublic 方法和verify 它。在EmailService 上调用的public 方法在内部调用private 方法。我通过将breakpoint 添加到MockitoLibraryNoMoreInteractions.java::verify() 来解决这个问题。

    breakpoint 显示有 2 个 interactions 使用 public 方法和 2 个 interactions 使用 private 方法。为了使 Mockito.verifyNoMoreInteractions(emailService) 的测试通过,我做了以下 2 处更改。

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

    这样测试就通过了。希望对其他人有所帮助

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

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多