我正在为我的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
多余。
您的测试对同一呼叫同时使用when
和verify
:utenteService.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
. 测试用例试图ArgumentCapture
public
方法并对其进行verify
。EmailService
调用的public
方法在内部调用private
方法。 我通过在NoMoreInteractions.java::verify()
MockitoLibrary
中添加一个breakpoint
来解决这个问题。
breakpoint
显示,public
法有2interactions
,private
法有2interactions
。 为了使测试通过Mockito.verifyNoMoreInteractions(emailService)
,我做了以下 2 项更改。
- 将私有方法更改为公共方法
- 添加
verify(emailService,times(2)).publicTurnedPrivateMethod()
验证。
也就是说,测试通过了。 希望它能帮助他人
我正在使用MockitoLibrary-2.23.4
和jUnit-4.12
库。 不确定此问题是否已在最新版本的mockito
库中修复。