Я пытаюсь написать модульный тест для своего класса 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 из службы и использовать
но это тоже не работает. Вызов projectService.getSharedProjects не пропускается.
Можете ли вы помочь в решении этой проблемы или посоветовать другой подход. Я хочу отбросить и не вызывать реальный метод projectService.getSharedProjects просто для проверки метода AssignSaredProjects?
Я пытаюсь написать модульный тест для своего класса ProjectsService. класс зависит от ProjectsRepository. Поэтому я аннотировал репозиторий с помощью @Mock, чтобы избежать вызова реальной базы данных, и аннотировал projectService с помощью @InjectMocks для внедрения необходимых зависимостей. Более того, я хочу протестировать некоторые методы в сервисе проектов, а не все. Я хочу протестировать метод AssignSharedProjects() и имитировать вызов и результат getSharedProjects(). Ниже приведен метод тестирования и фактический метод: [code]@SpringBootTest public class SharedProjectsServiceTest {
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 [/code] Я ожидаю выполнить метод AssignSharedProjects и получить возвращаемый оператор new String("Total Shared Percentage Exceeds 100"), поэтому метод AssertEquals удовлетворяет. Но фактический результат - исключение RunTimeException, и метод не выполняется с имитируемыми зависимостями, когда я его отлаживаю, а также параметры метода не передаются, а параметры отладки - это projectRepository this недоступен. Я пытался удалить @Spy из службы и использовать [code]when(projectsService.getSharedProjects(tokenInfo,90L, 1, 10, "benefitingProjectName", "asc",null)).thenThrow(RuntimeException.class); [/code] но это тоже не работает. Вызов projectService.getSharedProjects не пропускается. Можете ли вы помочь в решении этой проблемы или посоветовать другой подход. Я хочу отбросить и не вызывать реальный метод projectService.getSharedProjects просто для проверки метода AssignSaredProjects?
Я пытаюсь написать модульный тест для своего класса ProjectsService. Калс зависит от ProjectsRepository. Поэтому я аннотирую репозиторий с помощью @Mock, чтобы избежать вызова реальной базы данных, и аннотирую projectService с помощью @InjectMocks...
Я пытаюсь написать модульный тест для своего класса ProjectsService. Калс зависит от ProjectsRepository. Поэтому я аннотирую репозиторий с помощью @Mock, чтобы избежать вызова реальной базы данных, и аннотирую projectService с помощью @InjectMocks...
Я понимаю, что шпион вызывает настоящие методы объекта, а мошенник вызывает методы двойного объекта. Также следует избегать шпионов, если нет запаха кода.
Однако как работают шпионы и когда мне следует их использовать?
Чем они отличаются от мокапов?...
Я наблюдаю поведение, которое, по моему мнению, является ошибкой. @InjectMocks, похоже, не создает нового испытуемого перед каждым методом тестирования. Где, как это делает @Mock. В следующем примере, если subject.section является последним, @Test...
Я получил класс, используя фабрику для создания какого -то объекта.
В моем модульном тесте я хотел бы получить доступ к возврату значения завода.
Поскольку фабрика прямо передана в класс, и нет Getter для созданного объекта при условии, что мне...