Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要访问存储库的测试方法_Java_Spring_Junit_Mockito - Fatal编程技术网

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

Java 需要访问存储库的测试方法,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我试着通过考试来学习写作 @Service public class MailServiceImpl { @Autowired private SettingRepository settingRepository; public String buildTemplate(Template template, Map<String, String> templateParameters) { final String templateHeader = set

我试着通过考试来学习写作


@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
  }
}
我得到异常“NullPointerException”,如果可以在不更改任何代码的情况下测试此方法

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


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

public class MailServiceImplTest {

  @InjectMocks
  private MailServiceImpl mailService;

  @Mock
  private SettingRepository settingRepository;

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

您需要模拟
设置存储库的实例。简单地使用
@InjectMocks
不会神奇地注入
MailServiceImpl
的依赖项,因为如果您不指定它,Mockito不知道需要注入什么

public class MailServiceImplTest {

  @InjectMocks
  private MailServiceImpl mailService;

  @Mock
  private SettingRepository settingRepository;

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

对于我来说,注释在阅读代码方面从来都不是很清楚。 因此,您可以按照以下示例进行操作:

。。。
导入静态org.mockito.mockito.mock;
公共类MailServiceImplTest{
private SettingRepository SettingRepository=mock(SettingRepository.class);
private MailServiceImpl mailService=新的MailServiceImpl(设置存储库)
}
这样,读者就可以更清楚地看到,您正在测试邮件服务,它有一个新的实例

你在嘲笑存储库


您可以在构造函数中传递存储库。

对我来说,注释在阅读代码方面从来都不是很清楚。 因此,您可以按照以下示例进行操作:

。。。
导入静态org.mockito.mockito.mock;
公共类MailServiceImplTest{
private SettingRepository SettingRepository=mock(SettingRepository.class);
private MailServiceImpl mailService=新的MailServiceImpl(设置存储库)
}
这样,读者就可以更清楚地看到,您正在测试邮件服务,它有一个新的实例

你在嘲笑存储库


您可以在构造函数中传递存储库。

您向我们展示的代码甚至无法编译,因此我怀疑这是您的实际代码。我们无法在不反映实际代码的代码上诊断您的实际问题。例如,代码中不存在settingRepository。当你试图使用它的时候,你应该会得到一个编译时错误。你展示给我们的代码甚至不会编译,所以我怀疑这是你真正的代码。我们无法在不反映实际代码的代码上诊断您的实际问题。例如,代码中不存在settingRepository。@amazia说,当您尝试像您的方法那样使用itI时,应该会出现编译时错误。对我来说最好的是,它显示了通过构造函数进行依赖注入是多么伟大。现在人们只是不明白为什么构造函数注入是有益的,因为Mockito将它从开发人员那里完全抽象出来。使用您的解决方案(如果编程到接口),我们甚至可以用我们自己的mock实例替换SettingRepository,这使得在需要替换甚至删除Mockito时非常灵活。我喜欢您的方法,@amazia。对我来说最好的是,它显示了通过构造函数进行依赖注入是多么伟大。现在人们只是不明白为什么构造函数注入是有益的,因为Mockito将它从开发人员那里完全抽象出来。使用您的解决方案(如果编程到接口),我们甚至可以用我们自己的mock实例替换SettingRepository,这使得在需要替换甚至删除Mockito时非常灵活。
  @Test
  public void buildTemplate() {
Mockito.when(settingRepository.findByKey("test1")).thenReturn(new Setting());
    Mockito.when(settingRepository.findByKey("test2")).thenReturn(new Setting());
}
public class MailServiceImplTest {

  @InjectMocks
  private MailServiceImpl mailService;

  @Mock
  private SettingRepository settingRepository;