2016-04-24 81 views
1

我想为下面的汇编编写一个单元测试,但我总是收到通过RequestContextHolder找不到当前请求。这是从Spring MVC处理程序调用吗?。我想知道我可以如何模拟资源创建?如何在Spring Hateos中为ResourceAssembler编写mockito测试用例?

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

    } 

回答

3

我看到的错误找不到通过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")); 

    } 

} 
3

而不是从一个普通的单元测试更改为IMO集成测试(给定的依赖弹簧框架),你可以做类似这样的事情:

@RunWith(MockitoJUnitRunner.class) 
public class LoginResourceAssemblerTest { 
    @InjectMocks 
    private LoginResourceAssembler loginResourceAssembler; 

    @Before 
    public void setup() { 
     RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest())); 
    } 

    @Test 
    public void testToResource() { 
     //... 
    } 
} 
相关问题