2016-04-24 66 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() { 
     //... 
    } 
} 
相關問題