Mockito - 没有内部方法的测试方法

时间:2013-05-20 09:02:13

标签: java spring unit-testing testng mockito

我有以下课程

public class EmailManager{

  protected String getEmailContent(String content,String image){
     String result = content.toPrettyLook(); //this is an inner method
     result+="<img src='" + +"' />";
     return result;
  }

  protected String getImageLocation(String image){
      //write image to disc
      return newLocation;
  } 
}

public class EmailManagerTest{

  EmailManager emailManager;

  @Test
  public void testEmailContent(){
     String result = emailManager.getEmailContent("Hello World");
  }
}
  1. 我应该在EmailManager上面添加什么注释? @Spy @Mock或 @Autowired?

  2. 如何告诉Mockito不要执行getImageLocation(getEmailContent调用的方法)并始终 返回而不是“新位置”?我看到很多文章并得到了 混淆了“何时”“存根”“doReturn”

1 个答案:

答案 0 :(得分:3)

你想要的是一个间谍:一个部分模拟的对象。您想要测试真正的getEmailContent()方法,但是您想要存根同一对象的getImageLocation()方法。所以测试看起来应该是

public class EmailManagerTest{

    private EmailManager emailManager;

    @Test
    public void testEmailContent(){
        emailManager = spy(new EmailManager());
        doReturn("new location").when(emailManager).getImageLocation("someImage");
        String result = emailManager.getEmailContent("Hello World", "someImage");
        // assertions ...
    }
}

如果您想使用注释让Mockito为您创建间谍,那么您可以使用间谍注释:

@Spy
private EmailManager emailManager = new EmailManager();

不要忘记添加一个调用MockitoAnnotations.initClass(this)的@Before方法。

Mockito有很好的记录。阅读the documentation