Метод тестирования, который требует доступа к хранилищу

Я пытаюсь научиться писать тесты.


@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());
}

Всего 2 ответа


Вам нужно settingRepository экземпляр settingRepository . Простое использование @InjectMocks волшебным образом не @InjectMocks зависимости MailServiceImpl , поскольку Mockito не имеет ни малейшего представления, что нужно вводить, если вы не укажете это.

public class MailServiceImplTest {

  @InjectMocks
  private MailServiceImpl mailService;

  @Mock
  private SettingRepository settingRepository;

Я не буду объяснять разницу между @InjectMocks и @Mock поскольку она выходит за рамки вашего конкретного вопроса, но если вы хотите понять разницу между ними, вы можете проверить .



Есть идеи?

10000