2017-05-16 47 views
1

,我试图写单元测试用例是如下的控制器 -无法解析占位符在单位的Mockito测试

@RequestMapping("${rest.base.path}/plugin") 
public class Controller { 
. 
. 
. 
} 

单元测试案例是设置 -

@RunWith(MockitoJUnitRunner.class) 
public class ControllerTest { 

    @Autowired 
    private MockMvc mvc; 

    @InjectMocks 
    Controller dataController; 

    @Mock 
    PluginService pluginService; 


    @Test 
    public void createFiles() throws Exception { 
     this.mvc = MockMvcBuilders.standaloneSetup(dataController).build(); 
     mvc.perform(MockMvcRequestBuilders.get("/dc/plugin") 
       .contentType(MediaType.APPLICATION_JSON)); 
    } 

在运行单元测试时,无法解析占位符$ {rest.base.path},因为我没有加载Spring上下文。我尝试设置System.setProperty(“rest.base.path”,“/ api”)没有任何成功。无论如何,我可以给这个占位符赋值而不删除@RunWith(MockitoJUnitRunner.class)

+0

为什么不使用Mockito JUnit规则('@Rule public MockitoRule rule = MockitoJUnit.rule();')而不是'@ RunWith'。 –

+2

这将如何解决占位符问题? – davyjones

+1

而不是直接使用Mockito(假设你使用的是Spring Boot 1.4或更高版本),只需将其作为常规测试运行即可,取消“MockMvc”的设置并用'@ MockBean'替换'@ Mock',这将指示Spring Boot创建一个该bean的模拟并将其注入到使用它的地方。 –

回答

3

这里的关键是要自己填写占位符调用StandaloneMockMvcBuilder.addPlaceholderValue

由于文档状态:

在独立设置有用于嵌入请求映射占位符值不支持。此方法允许手动提供占位符值,以便可以解析它们。

所以,下面这个简单的代码片段应该为你工作

public class TestController { 

private MockMvc mockMvc; 

@Before 
public void setup() { 
    mockMvc = MockMvcBuilders.standaloneSetup(new Controller()).addPlaceHolderValue("rest.base.path", "dc") 
      .setControllerAdvice(new ExceptionMapper()) 
      .setMessageConverters(new MappingJackson2HttpMessageConverter(new ExtendedObjectMapper())).build(); 
} 

@Test 
public void testGet() throws Exception { 
    mockMvc.perform(get("/dc/plugin").accept(MediaType.APPLICATION_JSON_VALUE)).andExpect(status().isOk()); 
}} 

可以肯定的,你可以达到同样的自动装配控制器。

+0

这似乎工作。 – davyjones

相关问题