【问题标题】:How to write a mockito test case for ResourceAssembler with in Spring Hateos?如何在 Spring Hateoas 中为 Resource Assembler 编写模拟测试用例?
【发布时间】:2016-04-24 04:29:45
【问题描述】:

我正在尝试为以下汇编程序编写单元测试,但我不断收到 无法通过 RequestContextHolder 找到当前请求。这是从 Spring MVC 处理程序调用的吗?。我想知道如何模拟资源创建?

@Component
    public class LoginResourceAssembler extends ResourceAssemblerSupport<User, ResourceSupport> {

        public LoginResourceAssembler() {

            super(User.class, ResourceSupport.class);
        }

        @Override
        public ResourceSupport toResource(User user) {

            ResourceSupport resource = new ResourceSupport();
            final String id = user.getId();

            resource.add(linkTo(MyAccountsController.class).slash(id).slash("accounts").withRel("accounts"));

            return resource;
        }

    }

【问题讨论】:

    标签: spring-mvc mockito spring-hateoas


    【解决方案1】:

    您可以执行以下操作,而不是从简单的单元测试更改为 IMO 集成测试(鉴于 spring 框架的依赖性):

    @RunWith(MockitoJUnitRunner.class)
    public class LoginResourceAssemblerTest {
        @InjectMocks
        private LoginResourceAssembler loginResourceAssembler;
    
        @Before
        public void setup() {
            RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));
        }
    
        @Test
        public void testToResource() {
            //...
        }
    }
    

    【讨论】:

    • 如果您不想要完整的上下文加载,这是正确的答案
    【解决方案2】:

    我看到错误 无法通过 RequestContextHolder 找到当前请求。这是从 Spring MVC 处理程序调用的吗 因为我的测试类使用 @RunWith(MockitoJUnitRunner.class) 进行了注释,并且这没有注入控制器。 为了修复这个错误,我用

    注释了我的测试用例
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    

    我的案例中的一个工作测试用例

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    
    public class LoginResourceAssemblerTest {
    
        @Autowired
        private WebApplicationContext context;
    
        private MockMvc mockMvc;
    
        @InjectMocks
        private LoginResourceAssembler loginResourceAssembler;
    
        @Before
        public void setUp() {
    
            initMocks(this);
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
        }
    
        @Test
        public void testToResource() {
            User user = new User();
            user.setId("1234");
            ResourceSupport resource = loginResourceAssembler.toResource(user);
            assertEquals(1,resource.getLinks().size());
            assertEquals("accounts",resource.getLinks().get(0).getRel());
                    assertTrue(resource.getLinks().get(0).getHref().contains("accounts"));
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 2021-07-26
      • 1970-01-01
      • 2021-11-12
      • 2020-06-30
      • 1970-01-01
      • 2021-03-29
      • 2012-03-23
      • 2021-05-18
      相关资源
      最近更新 更多