Spring mvc 如何在SpringHateos中为ResourceAssembler编写mockito测试用例?

Spring mvc 如何在SpringHateos中为ResourceAssembler编写mockito测试用例?,spring-mvc,mockito,spring-hateoas,Spring Mvc,Mockito,Spring Hateoas,我正试图为下面的汇编程序编写一个单元测试,但我一直无法通过RequestContextHolder找到当前的请求。这是从Spring MVC处理程序调用的吗?。我想知道如何模拟资源创建 @Component public class LoginResourceAssembler extends ResourceAssemblerSupport<User, ResourceSupport> { public LoginResourceAssembler() {

我正试图为下面的汇编程序编写一个单元测试,但我一直无法通过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;
        }

    }
我看到错误,无法通过RequestContextHolder找到当前请求。这是从Spring MVC处理程序调用的,因为我的测试类用@RunWithMockitoJUnitRunner.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"));

    }

}
我看到错误,无法通过RequestContextHolder找到当前请求。这是从Spring MVC处理程序调用的,因为我的测试类用@RunWithMockitoJUnitRunner.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"));

    }

}

考虑到spring框架的依赖性,您可以执行以下操作,而不是从普通单元测试更改为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() {
        //...
    }
}

考虑到spring框架的依赖性,您可以执行以下操作,而不是从普通单元测试更改为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() {
        //...
    }
}

如果你不想要完整的上下文,这是正确的答案如果你不想要完整的上下文,这是正确的答案