Напишите тестовый пример Junit для Spring Retry max atttemps - PullRequest
0 голосов
/ 09 января 2020

Я хотел бы написать тестовый пример junit для повторения весны, я попробовал, как показано ниже, но junit не работает, как ожидалось. Я вызываю метод MaxAttemptRetryService.retry, если он не работает, он должен попытаться максимум 3 раза. Здесь Дао вызывает службу отдыха, которая не работает, поэтому она должна go пытаться максимум 3 раза. следовательно, метод dao.sam должен вызываться 3 раза.

Класс обслуживания:

@Service
@EnableRetry
public class MaxAttemptRetryService {   
    @Retryable(maxAttempts=3)
    public String retry(String username) throws Exception {
        System.out.println("retry???? am retrying...");
        int h = maxAttemptDao.sam();
        return "kkkk";
    }
}

Класс Dao:

@Component
public class MaxAttemptDao {
    public int sam() throws Exception{
        try{
            new RestTemplate()
            .getForObject("http://localhost:8080/greeting1/{userName}", 
                    String.class, "");
        }catch(Exception e){
            throw  e;
        }
        return 0;
    }
}

Класс тестирования:

@RunWith(SpringRunner.class)
public class HystrixServiceTest {

    @InjectMocks
    private MaxAttemptRetryService maxAttemptRetryService = new MaxAttemptRetryService();

    @Mock
    private MaxAttemptDao maxAttemptDao;

    @Test
    public void ff() throws Exception{
        when(maxAttemptDao.sam()).thenThrow(Exception.class);
        maxAttemptRetryService.retry("ll");
        verify(maxAttemptDao, times(3)).sam();
    }
}

1 Ответ

0 голосов
/ 09 января 2020
Примечания

@EnableRetry и @Retryable должны обрабатываться пружиной, которая должна генерировать прокси на лету во время выполнения вне DAO. Прокси добавит функциональность повтора.

Теперь, когда вы запускаете тест, я не вижу, чтобы он вообще работал весной. Вы упомянули, что используете Spring Boot, но не используете @SpringBootTest. С другой стороны, вы также не указываете конфигурацию для загрузки класса (аннотация * @ContextConfiguration на HystrixServiceTest class)

Поэтому я пришел к выводу, что вы не правильно инициализируете spring и это не может обработайте аннотацию @Retry в результате правильно.

Дополнительные вещи, которые мне кажутся неправильными:

Вам следует использовать @MockBean (если вы правильно начнете пружину в тесте), чтобы она не просто создаст @Mock (для которого вам нужен бегун mockito BTW), но создаст фиктивный пружинный бин и зарегистрирует его в контексте приложения, эффективно переопределяя стандартное объявление бина.

Я думаю, вы должны сделать что-то вроде этого:

@RunWith(SpringRunner.class)
@SpringBootTest
public class HystrixServiceTest {

  @Autowired // if everything worked right, you should get a proxy here actually (you can check that in debugger)
  private MaxAttemptRetryService maxAttemptRetryService;

  @MockBean
  private MaxAttemptDao maxAttemptDao;


  @Test
  public void ff() throws Exception{
      when(maxAttemptDao.sam()).thenThrow(Exception.class);
      maxAttemptRetryService.retry("ll");
      verify(maxAttemptDao, times(3)).sam();
  }


}
...