有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用MockMvcBuilders时的java Mocking@Resource。对峙

我的团队目前正在构建一个SpringBoot API。下面是我的团队如何模拟控制器测试的一个片段。当我们将普通类作为依赖项时,这是有效的

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestController {

    private MockMvc mockMvc;

    @Mock
    private MyService myService;

    @Autowired
    @InjectMocks
    private MyController myController;

    @Before
    public void setup() {

        //Build the controller mock handler
        mockMvc = MockMvcBuilders
            .standaloneSetup(myController)
            .build();
    }

我们无法弄清楚如何为类似的测试模拟下面这样的@Resource

@Resource(name = "domainNameToCode")
private Map<String, Integer> domainCodes;

共 (1) 个答案

  1. # 1 楼答案

    由于domainCodes是私有的,您的控制器需要有一种方法来为它设置值—构造函数或setter

    二传手

        @Autowired()
        @Qualifier("domainNameToCode")
        public void setDomainCodes(Map<String, Integer> domainCodes) {
            ...
        }
    

    构造函数

      @Autowired()
        @Qualifier("domainNameToCode")
        public MyController(Map<String, Integer> domainCodes){
    
        }
    

    在测试中,现在可以注入模拟


    如果不想编辑源,则可以使用反射在对象上设置私有实例变量

    //Using reflection to set a private field on an object
    FieldUtils.writeField(controllerInstance, "domainCodes", new HashMap<>()) ;