【问题标题】:Junit test class for dependency with value from application.properties具有来自 application.properties 的值的依赖项的 Junit 测试类
【发布时间】:2021-07-12 06:30:37
【问题描述】:

我正在为以下类编写 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;
    }
}

测试类如下:

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)

【问题讨论】:

  • 看起来expandQueryParam 为空。尝试在setup 中创建它。

标签: java spring-boot junit


【解决方案1】:

@Value是一个spring注解,它依赖于Spring Context来发挥作用。如果您希望@Value 从您的应用程序属性中读取值,那么您需要将您的单元测试转换为@SpringBootTest。看看this tutorial,了解更多关于 Spring Test 的信息。

您还使用了ReflectionTestUtils.setField(expandQueryParam, "expandParam", "expand");,它只会为该字段设置一个值,而不是从属性中读取它。您看到的这个异常是因为 expandQueryParam 为空,这些注解 @Spy@InjectMocks 是 Mockito 注解,并且它们初始化您需要启用 mockito 注解的对象,您可以通过添加 @ExtendWith(MockitoExtension.class) on你班上的佼佼者或在 setUp 方法中使用MockitoAnnotations.initMocks(this)

我认为你不需要 mockito 来测试这个类,在我看来进行 Spring 测试会是一个更好的选择,这样你也可以测试属性键的读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2011-03-12
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2016-09-30
    相关资源
    最近更新 更多