Junit 测试 class 的依赖性,其值来自 application.properties
Junit test class for dependency with value from application.properties
我正在为以下 class 编写 Junit 测试用例:
@Component
public class ExpandParam {
/* expand parameter with value "expand" */
@Value("${api.expand.value}")
private String expandParam;
public MultiValueMap<String, String> getExpandQueryParam(String[] expand) {
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
// Creating comma separated format string
StringBuilder builder = new StringBuilder();
for (String value : expand) {
if(!expand[expand.length-1].equals(value)) {
builder.append(value+", ");
}
else {
builder.append(value);
}
}
String expandText = builder.toString();
queryParams.add(expandParam, expandText);
return queryParams;
}
}
测试 class 如下:
public class ExpandParamTest {
@InjectMocks
@Spy
ExpandParam expandQueryParam;
// @Value("${api.expand.value}")
// private String expandParam;
private String[] expand = {"fees"};
@Before
public void setup() {
ReflectionTestUtils.setField(expandQueryParam, "expandParam", "expand");
}
@Test
public void testExpandParam() {
MultiValueMap<String, String> queryParams = expandQueryParam.getExpandQueryParam(expand);
try {
System.out.println(new ObjectMapper().writeValueAsString(queryParams));
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
申请中。属性文件我已经设置了值:
#expand param
api.expand.value: expand
我是新手,谁能告诉我我在哪里犯了错误:
出现以下错误:
java.lang.IllegalArgumentException:必须指定字段的 targetObject 或 targetClass
在 org.springframework.util.Assert.isTrue(Assert.java:121)
在 org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:178)
在 org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:107)
在 org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:91)
在 com.aig.rs.products.orchestrator.api.utils.ExpandParamTest.setup(ExpandParamTest.java:29)
@Value
是一个spring注解,它依赖于Spring上下文来发挥作用。如果您希望@Value 从您的应用程序属性中读取值,那么您需要将您的单元测试转换为@SpringBootTest
。查看 this tutorial 以了解更多关于 Spring 测试的信息。
您还使用了 ReflectionTestUtils.setField(expandQueryParam, "expandParam", "expand");
,它只会为此字段设置一个值,而不是从属性中读取它。您看到的这个异常是因为 expandQueryParam
为空,这些注释 @Spy
和 @InjectMocks
是 Mockito 注释,为了让它们初始化您的对象,您需要启用 mockito 注释,您可以这样做通过在 class 之上添加 @ExtendWith(MockitoExtension.class)
或在 setUp 方法中使用 MockitoAnnotations.initMocks(this)
。
我认为您不需要 mockito 来测试这个 class,在我看来,进行 Spring 测试会是更好的选择,这样您还可以测试 属性键。
我正在为以下 class 编写 Junit 测试用例:
@Component
public class ExpandParam {
/* expand parameter with value "expand" */
@Value("${api.expand.value}")
private String expandParam;
public MultiValueMap<String, String> getExpandQueryParam(String[] expand) {
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
// Creating comma separated format string
StringBuilder builder = new StringBuilder();
for (String value : expand) {
if(!expand[expand.length-1].equals(value)) {
builder.append(value+", ");
}
else {
builder.append(value);
}
}
String expandText = builder.toString();
queryParams.add(expandParam, expandText);
return queryParams;
}
}
测试 class 如下:
public class ExpandParamTest {
@InjectMocks
@Spy
ExpandParam expandQueryParam;
// @Value("${api.expand.value}")
// private String expandParam;
private String[] expand = {"fees"};
@Before
public void setup() {
ReflectionTestUtils.setField(expandQueryParam, "expandParam", "expand");
}
@Test
public void testExpandParam() {
MultiValueMap<String, String> queryParams = expandQueryParam.getExpandQueryParam(expand);
try {
System.out.println(new ObjectMapper().writeValueAsString(queryParams));
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
申请中。属性文件我已经设置了值:
#expand param
api.expand.value: expand
我是新手,谁能告诉我我在哪里犯了错误: 出现以下错误:
java.lang.IllegalArgumentException:必须指定字段的 targetObject 或 targetClass 在 org.springframework.util.Assert.isTrue(Assert.java:121) 在 org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:178) 在 org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:107) 在 org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:91) 在 com.aig.rs.products.orchestrator.api.utils.ExpandParamTest.setup(ExpandParamTest.java:29)
@Value
是一个spring注解,它依赖于Spring上下文来发挥作用。如果您希望@Value 从您的应用程序属性中读取值,那么您需要将您的单元测试转换为@SpringBootTest
。查看 this tutorial 以了解更多关于 Spring 测试的信息。
您还使用了 ReflectionTestUtils.setField(expandQueryParam, "expandParam", "expand");
,它只会为此字段设置一个值,而不是从属性中读取它。您看到的这个异常是因为 expandQueryParam
为空,这些注释 @Spy
和 @InjectMocks
是 Mockito 注释,为了让它们初始化您的对象,您需要启用 mockito 注释,您可以这样做通过在 class 之上添加 @ExtendWith(MockitoExtension.class)
或在 setUp 方法中使用 MockitoAnnotations.initMocks(this)
。
我认为您不需要 mockito 来测试这个 class,在我看来,进行 Spring 测试会是更好的选择,这样您还可以测试 属性键。