为字符串属性注入@InjectMocks

我有一个带有这个构造函数的弹簧MVC:@Controller

@Autowired
public AbcController(XyzService xyzService, @Value("${my.property}") String myProperty) {/*...*/}

我想为此控制器编写一个独立的单元测试:

@RunWith(MockitoJUnitRunner.class)
public class AbcControllerTest {

    @Mock
    private XyzService mockXyzService;

    private String myProperty = "my property value";

    @InjectMocks
    private AbcController controllerUnderTest;

    /* tests */
}

有没有办法注入我的 String 属性?我知道我不能嘲笑一个字符串,因为它是不可变的,但是我可以在这里注入一个普通的字符串吗?@InjectMocks

@InjectMocks在这种情况下,默认注入 null。 可以理解的是,如果我把它放在.c上,就会抛出一个异常。我是否错过了另一个注释,它只是意味着“注入这个确切的对象而不是它的模拟”?@MockmyProperty


答案 1

你不能用Mockito做到这一点,但是Apache Commons实际上有一种方法可以使用其内置的实用程序之一来做到这一点。你可以把它放在JUnit中的一个函数中,该函数在Mockito注入其余模拟之后但在测试用例运行之前运行,如下所示:

@InjectMocks
MyClass myClass;

@Before
public void before() throws Exception {
    FieldUtils.writeField(myClass, "fieldName", fieldValue, true);
}

答案 2

由于您正在使用Spring,因此可以使用来自模块的。它整齐地包装在对象上设置字段或类上的静态字段(以及其他实用工具方法)。org.springframework.test.util.ReflectionTestUtilsspring-test

@RunWith(MockitoJUnitRunner.class)
public class AbcControllerTest {

    @Mock
    private XyzService mockXyzService;

    @InjectMocks
    private AbcController controllerUnderTest;

    @Before
    public void setUp() {
        ReflectionTestUtils.setField(controllerUnderTest, "myProperty", 
               "String you want to inject");
    }

    /* tests */
}

推荐