2016-04-24 5 views
1

Ich versuche, einen Komponententest für den folgenden Assembler zu schreiben, aber ich bekomme Konnte die aktuelle Anfrage über RequestContextHolder nicht finden. Wird dies von einem Spring MVC-Handler aufgerufen?. Ich wollte wissen, wie ich die Erstellung von Ressourcen verspotten kann.Wie schreibe ich einen Mockito Testfall für ResourceAssembler mit in Spring Hateos?

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

    } 

Antwort

3

ich den Fehler sehen nicht aktuelle Anfrage über RequestContextHolder gefunden. Wird dies von einem Spring-MVC-Handler aufgerufen, weil meine Testklasse mit @RunWith (MockitoJUnitRunner.class) versehen wurde und dies den Controller nicht injiziert hat. diese Fehler zu beheben, kommentierte ich meinen Testfall mit

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 

Einem Arbeitstestfall in meinem Fall

@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

Statt aus einem einfachen Unit-Test zu einem IMO Integrationstest (bei Abhängigkeit der Änderung von die Feder Rahmen) Sie könnten etwas tun wie:

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

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

    @Test 
    public void testToResource() { 
     //... 
    } 
}