当前位置: 首页 > 知识库问答 >
问题:

为Spring重试max atttemps编写Junit测试用例

杜阳泽
2023-03-14

我想为SpringRetry编写一个junit测试用例,我像下面这样尝试过,但是junit没有按预期工作。我打电话给MaxAttemptRetryService。重试方法,如果失败,最多必须尝试3次。在这里,Dao正在调用一个rest服务,即停止,因此它最多应该尝试3次。因此道。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个答案

周滨海
2023-03-14

@EnableRetry@Retryable注释应该由Spring处理,因为Spring应该在DAO的运行时动态生成代理。代理将添加重试功能。

现在,当您运行测试时,我看不出它是否运行spring。您提到您正在运行Spring Boot,但您没有使用@SpringBootTest。另一方面,您也没有指定要从中加载类的配置(HystrixServiceTestclass上的@ContextConfiguration注释)

因此,我的结论是,您没有正确初始化Spring,因此它不能正确处理@Retry注释。

在我看来其他错误的事情:

您应该使用@MockBean(如果您在测试中正确地启动了spring),这样它不仅会创建一个@Mock(您需要一个mockito运行程序),而且会创建一个mockspring bean,并在应用程序上下文中注册它,从而有效地覆盖标准bean声明。

我认为你应该这样做:

@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();
  }


}
 类似资料:
  • customer-Mapper.xml daoimpl.java

  • 请注意,我没有访问实际的代码在一个地方,我可以张贴它。 此外,我也限于(由于不幸的原因)使用Spring 3.0.5或3.1.2。

  • 问题内容: 这是我使用的文件: component.xml ServiceImpl.java ServiceImplTest.java 错误: 问题答案: 确保已导入正确的程序包。如果我正确地记住,有两种不同的自动布线套件。应该 : 这对我来说也很奇怪: 这是一个适合我的示例:

  • 我是故意在谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用了模拟,而这些测试不会去任何地方。系统测试应该是对单元测试的补充,因此,模拟不是一种选择。 如果我将替换为一个test-method(让我们称之为),并引入一个顺序依赖项(使用JUnit 5非常容易),它强制在运行任何其他测试之前运行,那么这些问题就会消失。 到目前为止还好!这看起来和工作很好。当测试不是由CI服务器执行,而是由

  • 以下是我使用的文件: 组成部分xml 服务我mpl.java est.java 错误:

  • 我正在尝试为这样的情况编写测试用例,在这个情况下,我期待的是datatruncation异常,我试图使用assert equals和比较消息来断言相同的情况,但是看起来像是比较两个字符串,有没有更好的方法来为这样的异常编写测试用例。 我正在使用JUnit5