Совет не применяется в модульных тестах - PullRequest
0 голосов
/ 03 июня 2019

Рекомендации Spring AOP не применяются для юнит-тестов.Кажется, что все работает нормально во время нормального выполнения и интеграционных тестов, но не применяется во время выполнения модульных тестов.

Относительно новичок в Spring и некоторое время боролся с этой проблемой.Похоже, некоторые проблемы с конфигурацией.Пробовал с разными бегунами, но не повезло.Также пытался интегрировать с AspectJWeaver для создания времени компиляции, но столкнулся со многими проблемами компиляции в устаревшей базе кода, которые я отступил.

Юнит-тест

@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAspectJAutoProxy
public class UserServiceImpl

    private UserServiceImpl userServiceSpy; 
    @Mock
    private UserDao userDao;
    @Mock
    private MembershipDao membershipDao;
    @Mock
    private Service1 service1;
    @Mock
    private Service2 service2;
    @Mock
    private TroubleshootingLogService troubleshootingLogService;

    @Before
    public void setup() {
       UserServiceImpl userService = new UserServiceImpl(userDao, membershipDao,service1, service2, <param1>, <param2>);

       userServiceSpy = spy(userService)
    // some other variables inits... 
    }

    // All the unit tests. 

Интеграционный тест

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestExecutionListeners(value = {FlywayTestExecutionListener.class}, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS)
@FlywayTest
@ActiveProfiles("local")

public class UserServiceIntegrationTest { 
    @ClassRule
    public static final WireMockClassRule wireMockRule = new WireMockClassRule(wireMockConfig().dynamicPort());

     @Autowire
    private UserDao userDao;
    @Autowire
    private MembershipDao membershipDao;
    @Autowire
    private Service1 service1;
    @Autowire
    private Service2 service2;

  @Before
  public void init(){
     //clean up persisted test states 

  }

  // All integration tests 

}

Аспект

@Aspect
@Component
@Order(1)
public class UserExceptionLoggingAdvisor extends AbstractExceptionLoggingAdvisor {
  private static final Logger LOGGER = LoggerFactory.getLogger(UserExceptionLoggingAdvisor.class);

  @Around("@annotation(LogException) && args(directoryId, userId, userToUpdate)")
    public Object handleException(ProceedingJoinPoint joinPoint, String directoryId, String userId, ExternalUser userToUpdate) throws Throwable {
        LOGGER.debug("Advising execution to handle possible ScimException");
}

Когда у нас есть точка останова в классе Aspect, в строке private static final Logger LOGGER = LoggerFactory.getLogger(UserExceptionLoggingAdvisor.class);, тестовый модуль прерывается.Но он не нарушает фактический совет @Around для модульных тестов, в то время как он подходит для интеграционных тестов.

Может кто-нибудь посоветовать мне, как решить эту проблему.

1 Ответ

0 голосов
/ 04 июня 2019

Это не «проблема конфигурации»

Поскольку вы не раскрыли, как вы называете свои юнит-тесты и ни один из классов. Я предполагаю, что это не сработало, так как вы указали полное имя для вашей LogException аннотации.

должно быть my.full.packagename.logexception

Мой совет: сделайте ваши "юнит-тесты" как можно проще и оставьте эту идею, чтобы заставить Аспекты работать в вашем модульном тесте.

Слишком много издевательств - это никогда не хорошо, Тестирование в туалете: не злоупотребляйте насмешками

...