java - 需要访问存储库的测试方法

标签 java spring junit mockito

我尝试学习编写测试。


@Service
public class MailServiceImpl {
  @Autowired
  private SettingRepository settingRepository;

  public String buildTemplate(Template template, Map<String, String> templateParameters) {

    final String templateHeader = settingRepository.findByKey("test1").getValue();
    final String templateFooter = settingRepository.findByKey("test2").getValue();

    String content = replaceParameters(template.getContent(), templateParameters);

    StringBuilder builder = new StringBuilder();
    builder.append(templateHeader);
    builder.append(content);
    builder.append(templateFooter);

    return builder.toString();
  }

  private String replaceParameters(String content, Map<String, String> templateParameters) {
    for (Entry<String, String> parameter : templateParameters.entrySet()) {
      content = content.replace(
          String.format("{{ %s }}", parameter.getKey()),
          parameter.getValue()
      );
    }
    return content;
  }
}

public class MailServiceImplTest {

  @InjectMocks
  MailServiceImpl mailService;

  @Before
  public void setup() {
    initMocks(this);
  }

  @Test
  public void buildTemplate() {

    Template template = new Template();
    template.setContent("lorem ipsum");

    String content = mailService.buildTemplate(template, new HashMap<>());

    // assertion
  }
}

我的问题是在这部分:

final String templateHeader = settingRepository.findByKey("test1").getValue();

我收到异常“NullPointerException”,是否可以在不更改任何代码的情况下测试此方法?

数据库是 MongoDB,所以我需要创建一些带有键“test1”、“test2”的“虚拟”文档吗?


@Repository
public interface SettingRepository extends PagingAndSortingRepository<Setting, String> {

  Setting findByKey(String id);
}

感谢您的帮助

<小时/>

解决方案:

  @Test
  public void buildTemplate() {
Mockito.when(settingRepository.findByKey("test1")).thenReturn(new Setting());
    Mockito.when(settingRepository.findByKey("test2")).thenReturn(new Setting());
}

最佳答案

您需要模拟 settingRepository 的实例。简单地使用 @InjectMocks 不会神奇地注入(inject) MailServiceImpl 的依赖项,因为如果您不指定,Mockito 不知道需要注入(inject)什么。

public class MailServiceImplTest {

  @InjectMocks
  private MailServiceImpl mailService;

  @Mock
  private SettingRepository settingRepository;

我不会解释 @InjectMocks@Mock 之间的区别,因为它超出了您的具体问题的范围,但如果您想了解两者之间的区别二、可以查看this question .

关于java - 需要访问存储库的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56162966/

相关文章:

java - Spring JPA规范

java - 如何在一个jsp页面引用另一个jsp页面?

java - 如何在 IntelliJ IDEA 中调试 RESTful Web 服务的 JUnit 测试类?

java - 如何使用 Mapbox 的 Annotation 插件在圆下划线?

java - 尝试使用 java 类发送电子邮件时抛出错误

java - 如何使用 Spring Security 允许转发到外部 URL

java - Junit集成测试

java - 构建失败/然后传入 Netbeans

java - 使用mysql在hibernate中自动创建数据库

Java - 通过 HTTP 服务器发送文件