@Spy с @InjectMocks в MockitoJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 @Spy с @InjectMocks в Mockito

Сообщение Anonymous »

Я пытаюсь написать модульный тест для своего класса ProjectsService. класс зависит от ProjectsRepository. Поэтому я аннотировал репозиторий с помощью @Mock, чтобы избежать вызова реальной базы данных, и аннотировал projectService с помощью @InjectMocks для внедрения необходимых зависимостей. Более того, я хочу протестировать некоторые методы в сервисе проектов, а не все. Я хочу протестировать метод AssignSharedProjects() и имитировать вызов и результат getSharedProjects(). Ниже приведен метод тестирования и фактический метод:

Код: Выделить всё

@SpringBootTest
public class SharedProjectsServiceTest {

@InjectMocks
@Spy
ProjectsService projectsService;

@Mock
ProjectsRepository projectsRepository;

@BeforeEach
void setUp() throws ApiException {
tokenInfo = new TokenInfo();
tokenInfo.setUserName("john doe");

ProjectsEntity mockBenefitProject = new ProjectsEntity();
mockBenefitProject.setPrjId(70L);

ProjectsEntity mockBenefitProject2 = new ProjectsEntity();
mockBenefitProject2.setPrjId(87L);

SharedProjectsEntity shr1 = new SharedProjectsEntity();
shr1.setId(new SharedProjectsId(90L, 70L));
shr1.setBenefitingProject(mockBenefitProject);
shr1.setSharedPercentage(50.0);

ProjectsEntity mockOriginalProject = new ProjectsEntity();
mockOriginalProject.setPrjId(90L);
mockOriginalProject.setSharedProjects(List.of(shr1));

when(projectsRepository.findByPrjId(90L)).thenReturn(mockOriginalProject);
when(projectsRepository.findByPrjId(70L)).thenReturn(mockBenefitProject);
when(projectsRepository.findByPrjId(87L)).thenReturn(mockBenefitProject2);
}

@Test
void testingAssignProjectsToSharedProject() throws ApiException {
doThrow(RuntimeException.class).when(projectsService).getSharedProjects(tokenInfo,90L, 1, 10, "benefitingProjectName", "asc",null);
doCallRealMethod().when(projectsService).assignSharedProjects(tokenInfo, 90L, Map.of(87L, 40.0, 70L, 20.0),1,10,"benefitingProjectName","asc");
Object result = projectsService.assignSharedProjects(tokenInfo, 90L, Map.of(87L, 40.0, 70L, 20.0), 1, 10, "benefitingProjectName", "asc");

assertEquals("Total Shared Percentage Exceeds 100", result);

}

//The actual method is the ProjectsService Class:

public Object assignSharedProjects(TokenInfo tokenInfo, Long OriginalProjectId, Map sharedProjectsId, int page, int rows,String attr, String sortBy ) throws ApiException{
ProjectsEntity originalProject = projectsRepository.findByPrjId(OriginalProjectId);
if(originalProject == null) {
throw ExceptionConstants.PROJECT_NOT_EXISTS;
}
Map  testSharedProjectsId = new HashMap(sharedProjectsId);
double[] sharedPercentage = {0};
originalProject.getSharedProjects().forEach((c)->{
if(sharedProjectsId.containsKey(c.getBenefitingProject().getPrjId())){
sharedPercentage[0] += testSharedProjectsId.get(c.getBenefitingProject().getPrjId());
testSharedProjectsId.remove(c.getBenefitingProject().getPrjId());
}else{
sharedPercentage[0] += c.getSharedPercentage();
}
});

if (sharedPercentage[0]>100){
return new String("Total Shared Percentage Exceeds 100");
}

for(Long id: testSharedProjectsId.keySet()){
sharedPercentage[0] += testSharedProjectsId.get(id);
if (sharedPercentage[0]>100){
return new String("Total Shared Percentage Exceeds 100");
}
}

for(Long sharedProjectId: sharedProjectsId.keySet()){
ProjectsEntity benefitingProject = projectsRepository.findByPrjId(sharedProjectId);
if(benefitingProject == null) {
throw ExceptionConstants.PROJECT_NOT_EXISTS;
}

SharedProjectsId id = new SharedProjectsId();
id.setSharedProjectId(OriginalProjectId);
id.setBenefitingProjectId(sharedProjectId);

SharedProjectsEntity sharedProjectsEntity = new SharedProjectsEntity();
sharedProjectsEntity.setId(id);
sharedProjectsEntity.setProject(originalProject);
sharedProjectsEntity.setBenefitingProject(benefitingProject);
sharedProjectsEntity.setBenefitingProjectName(benefitingProject.getPrjName());
sharedProjectsEntity.setSharedPercentage(sharedProjectsId.get(sharedProjectId));
sharedProjectsEntity.setSharedCreatedBy(tokenInfo.getUserName());
sharedProjectsEntity.setSharedCreatedOn(currentTime());
sharedProjectsEntity.setSharedUpdatedBy(tokenInfo.getUserName());
sharedProjectsEntity.setSharedUpdatedOn(currentTime());
sharedProjectsEntity.setClientName(tokenInfo.getClientName());
sharedProjectsRepository.save(sharedProjectsEntity);
}
return getSharedProjects(tokenInfo,OriginalProjectId, page,  rows, attr,  sortBy ,null);
} // assign shared projects to original project
Я ожидаю выполнить метод AssignSharedProjects и получить возвращаемый оператор new String("Total Shared Percentage Exceeds 100"), поэтому метод AssertEquals удовлетворяет. Но фактический результат - исключение RunTimeException, и метод не выполняется с имитируемыми зависимостями, когда я его отлаживаю, а также параметры метода не передаются, а параметры отладки - это projectRepository this недоступен.
Я пытался удалить @Spy из службы и использовать

Код: Выделить всё

when(projectsService.getSharedProjects(tokenInfo,90L, 1, 10, "benefitingProjectName", "asc",null)).thenThrow(RuntimeException.class);
но это тоже не работает. Вызов projectService.getSharedProjects не пропускается.
Можете ли вы помочь в решении этой проблемы или посоветовать другой подход. Я хочу отбросить и не вызывать реальный метод projectService.getSharedProjects просто для проверки метода AssignSaredProjects?

Подробнее здесь: https://stackoverflow.com/questions/790 ... in-mockito
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • @Spy с @InjectMocks в Mockito
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • @Spy с @InjectMocks в Mockito
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Mockito — @Spy против @Mock [дубликат]
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Mockito, странное поведение @InjectMocks с конечными полями
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Mockito + Spy: Как собрать возвратные значения
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»