Java 如何在单元测试中设置字符串的值?

Java 如何在单元测试中设置字符串的值?,java,unit-testing,junit,mocking,mockito,Java,Unit Testing,Junit,Mocking,Mockito,在我当前的类中,有一个字段如下所示: 阶级 配置属性 public static final String ADDRESS = // "42 Rue Cadet, 75009 Paris"; 我有一个方法: ...... private boolean isValidAddress() { if(address != null && address.equals("42 Rue Cadet, 75009 Paris")) { r

在我当前的类中,有一个字段如下所示:

阶级

配置属性

  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号,75045”。 我想模拟ConfigProperties,但我在ConfigProperties中没有任何可以设置地址值的方法


有什么建议吗

我们面临着同样的问题,使用反射来解决许多人提出的问题相当麻烦。。。因此,我们编写了一个JUnit5扩展来解决这个问题:

它所做的是将与您提供的映射中的键名相同的值注入到您的被测类中

@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();
 }
@TestInstance(生命周期每_方法)
@ExtendWith({MockitoExtension.class,InjectMapExtension.class})
公共类MyControllerTest{
@注射模拟
私有MyController-MyController;
@嘲弄
私人日志记录器;
@嘲弄
私有认证者;
@注入映射
私有映射injectionMap=新HashMap();
@之前
public void beforeach()引发异常{
injectionMap.put(“securityEnabled”,Boolean.TRUE);
}
@之后
public void afterEach()引发异常{
injectionMap.clear();
}
public void testDoSomething_secEnabled()引发异常{
myController.doSomething();
}

我们面临着同样的问题,使用反射来解决许多人提出的问题相当麻烦……因此我们编写了一个JUnit5扩展来解决这个问题:

它所做的是将与您提供的映射中的键名相同的值注入到您的被测类中

@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();
 }
@TestInstance(生命周期每_方法)
@ExtendWith({MockitoExtension.class,InjectMapExtension.class})
公共类MyControllerTest{
@注射模拟
私有MyController-MyController;
@嘲弄
私人日志记录器;
@嘲弄
私有认证者;
@注入映射
私有映射injectionMap=新HashMap();
@之前
public void beforeach()引发异常{
injectionMap.put(“securityEnabled”,Boolean.TRUE);
}
@之后
public void afterEach()引发异常{
injectionMap.clear();
}
public void testDoSomething_secEnabled()引发异常{
myController.doSomething();
}

您可以通过反射设置
地址
,或者将其设置为受保护的而不是私有的,但是从测试中调用
isValidAddress
也会有困难,因为它是私有的,除非您的意思是调用使用
isValidAddress
的类的公共API的其他部分。通常,您只对publ进行单元测试ic API,而不是私人助手方法。@DavidConrad,是的,我在另一个方法中使用了
isValidAddress
。通过反射,你是指使用setter和getter吗?不,通过反射,我是指通过
java.reflect.field
访问字段,并直接设置其值。你可以通过反射设置
地址
,或使其受到保护r不是private,但是您在测试中调用
isValidAddress
时也会遇到问题,因为它是private,除非您的意思是要调用使用
isValidAddress
的类的公共API的其他部分。通常您只对公共API进行单元测试,而不是对私有助手方法进行单元测试。@DavidConrad,是的,我正在使用
isvaliddress
在另一种方法中。通过反射你是指使用setter和getter吗?不,通过反射我指的是通过
java.reflect.field
访问字段并直接设置其值。