首页 > 解决方案 > 如何在单元测试中为字符串设置值?

问题描述

在我目前的课程中,我有一个如下所示的字段:

班级

 @Inject
 @ConfigValue(key = ConfigProperties.ADDRESS)
 private String address;

配置属性

  public static final String ADDRESS = //
        "42 Rue Cadet, 75009 Paris";

我有一个方法:

 ...... 
 private boolean isValidAddress() {
    if(address != null && address.equals("42 Rue Cadet, 75009 Paris")) {
        return true;
    } else {
        return false;
    }
 } 
 ......

我想创建一个单元测试来验证 isValidAddress() 方法,但我不知道如何设置地址。

例如:我想用这个地址进行测试 =“23 Rue Luvru, 75045 Paris”。我正在考虑模拟 ConfigProperties,但我在 ConfigProperties 中没有任何方法可以设置地址的值。

有什么建议么 ?

标签: javaunit-testingjunitmockingmockito

解决方案


我们遇到了同样的问题,并且像许多人建议的那样使用反射来解决问题非常麻烦......所以我们编写了一个 JUnit5 Extension 来解决这个确切的问题:

https://github.com/exabrial/mockito-object-injection

它所做的是将值注入到您的测试类中,这些值在您提供的 Map 中具有相同的键名。

@TestInstance(Lifecycle.PER_METHOD)
@ExtendWith({ MockitoExtension.class, InjectMapExtension.class })
public class MyControllerTest {
 @InjectMocks
 private MyController myController;
 @Mock
 private Logger log;
 @Mock
 private Authenticator auther;
 @InjectionMap
 private Map<String, Object> injectionMap = new HashMap<>();

 @BeforeEach
 public void beforeEach() throws Exception {
  injectionMap.put("securityEnabled", Boolean.TRUE);
 }

 @AfterEach
 public void afterEach() throws Exception {
  injectionMap.clear();
 }

 public void testDoSomething_secEnabled() throws Exception {
  myController.doSomething();
 }

推荐阅读