2017-09-10 78 views
2

我想在当前应用中使用TDD并尝试创建一些测试。在这种情况下,我需要发送消息来支持,如果它可以返回true。但是当我开始我的测试时,我会失败,因为实际和预期的结果是不一样的。模拟不正常工作

当我调试这个测试时,我看到,mockito把Mocks放在我需要的位置,但sender.sendSupportMessage() steel返回false。有人可以解释我发生了什么问题吗?

public class SupportTests { 

    @Rule 
    public MockitoRule rule = MockitoJUnit.rule(); 

    @Mock 
    SupportContract.ISupportMessageSender sender; 
    @Mock 
    CurrentUserOperations currentUserOperations; 

    private SupportMessage stubSupportMessage; 
    private String message; 

    @Before 
    public void init(){ 
     message = "message"; 
     stubSupportMessage = new SupportMessage(1, message, null); 
    } 

    @Test 
    public void testSendMessageToSupportShouldBeDone(){ 
     Support support = new Support(sender, currentUserOperations); 

     when(currentUserOperations.getCurrentUserSystemId()) 
      .thenReturn(Long.valueOf(1)); 
     when(sender.sendSupportMessage(stubSupportMessage)) 
      .thenReturn(true); 

     boolean actualResult = support.sendMessageToSupport(message); 

     assertEquals("Sending message to support are failed.", true, actualResult); 
    } 

} 


public class Support implements SupportContract.ISupport { 

    private SupportContract.ISupportMessageSender sender; 
    private CurrentUserOperations currentUserOperations; 

    public Support(SupportContract.ISupportMessageSender sender, CurrentUserOperations currentUserOperations) { 
    this.sender = sender; 
    this.currentUserOperations = currentUserOperations; 
    } 

    @Override 
    public boolean sendMessageToSupport(String message) { 
     long userSystemId = currentUserOperations.getCurrentUserSystemId(); 

     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 

     SupportMessage supportMessage = new SupportMessage(userSystemId, message, 
      dateFormat.format(Calendar.getInstance().getTime())); 

     return sender.sendSupportMessage(supportMessage); 
    } 
} 

回答

0

好的。我找到解决方案。如我们所见,在TestMethod中我们使用stubSupportMessage,它在@Before init方法中实例化。

此外,在Support类我们看到SupportMessage supportMessage = new SupportMessage(...),这些支持消息是不一样stubSupportMessage != supportMessage

所以,我们需要摆脱不同的对象。问题终于解决了这个代码:

when(sender.sendSupportMessage(any(SupportMessage.class))).thenReturn(true); 

当我们说SupportMessageany对象都可以使用。

现在测试类:

public class SupportTests { 

@Rule 
public MockitoRule rule = MockitoJUnit.rule(); 

@Mock 
SupportContract.ISupportMessageSender sender; 
@Mock 
CurrentUserOperations currentUserOperations; 

private String message; 

@Before 
public void init(){ 
    message = "message"; 
} 

@Test 
public void testSendMessageToSupportShouldBeDone(){ 
    Support support = new Support(sender, currentUserOperations); 

    when(currentUserOperations.getCurrentUserSystemId()).thenReturn(Long.valueOf(1)); 
    when(sender.sendSupportMessage(any(SupportMessage.class))).thenReturn(true); 

    boolean actualResult = support.sendMessageToSupport(message); 

    assertEquals("Sending message to support are failed.", true, actualResult); 
} 

}