Я тестирую бизнес-сервис с TestNG, модульные тесты mockito в приложении загрузки spring.
Приложение представляет собой многомодульный проект загрузки spring. И я пишу модульные тесты для бизнес-модуля.
Я добавил следующие зависимости, связанные с тестированием в pom,
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
   <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>${testng.version}</version>
    <scope>test</scope>
 </dependency>
 <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <scope>test</scope>
 </dependency>
 <dependency>
     <groupId>org.hsqldb</groupId>
     <artifactId>hsqldb</artifactId>
     <scope>test</scope>
 </dependency>
 <dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-validator</artifactId>
     <scope>test</scope>
 </dependency>
 <dependency>
     <groupId>javax.el</groupId>
     <artifactId>el-api</artifactId>
     <version>${javaxel.version}</version>
     <scope>test</scope>
 </dependency>
 <dependency>
      <groupId>org.glassfish</groupId>
      <artifactId>javax.servlet</artifactId>
      <version>${javax.servlet.version}</version>
      <scope>test</scope>
 </dependency>
Моя аннотация оболочки выглядит как
@Service
@Transactional
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyServiceAnnotation{}
My TestApp выглядит как
@SpringBootApplication
public class TestApp{ .... }
Мой бизнес-сервис выглядит как
@MyServiceAnnotation
public class AddressServiceImpl implements AddressService {
       @Autowire
       UserDAO userDAO;
       @Autowire
       AddressDAO addressDAO;
       public Address find(int userId) {
              user =  userDAO.findOne(userId);
              /** if I run following test then I get user NULL.
                  But it should get user object which I have created
                  in data provider 
               **/
              if(user == null ) { throw new BadReqExcp("invalid user Id", 101); }
              address = user.findAddresses();
              if(address is empty) { throw new BadReqExcp("add not found", 102);}
              return address;
       }
}
MyTestClass выглядит как
@ContextConfiguration(classes = { TestApp.class })
class MyTestClass{ 
    @Mock
    UserDAO userDAO;
    @InjectMocks
    @Autowire
    AddressService addressServie;
    @BeforeMethod
    public void initMock() {
        MockitoAnnotations.initMocks(this);
    }
    @Test(dataProvider = "getUser", dataProviderclass = UserDP.class)
    public void shouldThrowExceptionAddressNotFound(int userId, User user)
    {
        when(userDAO.findOne(userId)).thenReturn(user);  //here dao call should return user but it is returning null
         try{
              addressService.find(userId);
         }
         catch(BadReqExcp e){
              // Here errro code should be 102 but fount 101
               assertEquals(e.getErrorCode(), 102);
         }
    }
}
Если я не использую @Target(ElementType.TYPE), @Retention(RetentionPolicy.RUNTIME), @Inherited эти аннотации, то мои макетные вызовы DAO в тесте работают нормально.
Мне нужно больше аннотаций, потому что, если я их не использую,
Например, если я хочу выполнить одну задачу, которая использует несколько бизнес-сервисов, то  они не будут выполняться в транзакции ONE.
Другими словами, если бизнес-вызов использует несколько бизнес-сервисов, скажем ServiceA и ServiceB. Звонок идет от ServiceA до ServiceB. Если в ServiceB возникает исключение, то изменения базы данных, сделанные ServiceA, не будут отменены.
Когда я использую выше аннотации, то выше пример работает, но макетирование вызовов DAO в тестах junit не работает.
Есть ли у меня неправильные зависимости в pom?
- Почему это не работает?
- Каким будет решение?
Git Исходный код репозитория, здесь вы получите образец кода. Это дает мне некоторую ошибку, пока компилирование.
