gpt4 book ai didi

java - 如何使用 Junit/Mockito 编写此费用计算器服务的测试用例?

转载 作者:太空宇宙 更新时间:2023-11-04 10:09:21 25 4
gpt4 key购买 nike

我有这个服务级别 -

package com.test.common.fee;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.MathContext;

import javax.annotation.PostConstruct;

import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class FeeCalcService {

@Value("${json.config.folder}")
String jsonConfigFolder;

FeeConfigEntity feeConfig = new FeeConfigEntity();

@PostConstruct
public void init() throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
File jsonFile = getFilesInFolder(jsonConfigFolder);

// deserialize contents of each file into an object of type
feeConfig = jsonMapper.readValue(jsonFile, FeeConfigEntity.class);
}

public BigDecimal calculateFee(BigDecimal amount)
{
String type = feeConfig.getType();
Integer total = feeConfig.getDetails().size();
BigDecimal fee = new BigDecimal(0);
if(type.equals("slab"))
{
if(total>1)
{
for(FeeConfigDetailsEntity eachSlab : feeConfig.getDetails()){
BigDecimal min = BigDecimal.valueOf(eachSlab.getDetails().getMin());
BigDecimal max = BigDecimal.valueOf(eachSlab.getDetails().getMax());
if((amount.compareTo(min) == 1 || amount.compareTo(min) == 0)
&&
(amount.compareTo(max) == -1 || amount.compareTo(min) == 0)
)
{
float value = eachSlab.getDetails().getValue();
if(eachSlab.getDetails().getType().equals("flat"))
{
fee = BigDecimal.valueOf(value);
}
else if(eachSlab.getDetails().getType().equals("fixed"))
{
MathContext mc = new MathContext(4); // 4 precision
fee = amount.multiply(BigDecimal.valueOf(value), mc).divide(BigDecimal.valueOf(100), mc);
}
break;
}
}
}
}
else if(total>1)
{
//incorrect setup
}
else
{//expected flat/fixed
float value = feeConfig.getDetails().get(0).getDetails().getValue();

if(type.equals("flat"))
{
fee = BigDecimal.valueOf(value);
}
else if(type.equals("fixed"))
{
MathContext mc = new MathContext(4); // 4 precision
fee = amount.multiply(BigDecimal.valueOf(value), mc).divide(BigDecimal.valueOf(100), mc);
}
}

return fee;
}

/*public List<ContextOperatorBean> getMatchingOperators(String context) {
return operators.stream().filter(operator -> checkIfMatches(operator, context)).collect(Collectors.toList());
}

private boolean checkIfMatches(ContextOperatorBean operator, String context) {
// TODO implement
return false;
}*/

private File getFilesInFolder(String path) {
// TODO implement
File test = new File(path);
return test;
}
}

init() 函数将此结构的 json 文件加载到类 FeeConfigEntity 中 -

{
"type": "slab",
"details": [{
"slabName": "slab_1",
"details": {
"min": 0,
"max": 100,
"type": "fixed",
"value": "12"
}
},
{
"slabName": "slab_2",
"details": {
"min": 101,
"max": null,
"type": "flat",
"value": "100"
}
}
]
}

FeeConfigEntity类的结构-

package com.test.common.fee;

import java.util.List;

public class FeeConfigEntity {

private String type;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public List<FeeConfigDetailsEntity> getDetails() {
return details;
}

public void setDetails(List<FeeConfigDetailsEntity> details) {
this.details = details;
}

private List<FeeConfigDetailsEntity> details;

}

基本上,这是一项返回带有佣金/费用的输出的服务,该佣金/费用将根据 json 文件中定义的佣金结构适用于一定金额。

这就是我从我的应用程序中调用它的方式 -

BigDecimal fee = feeCalcService.calculateFee(amount);

我对 Junit 测试非常陌生,不知道到底应该如何完成。

我的想法是 -

  • 服务类结构需要进行一些更改。
  • init 函数不返回任何内容,因此我不能在此处放置when() thenReturn(),否则我可以用我需要的内容覆盖这里。

最佳答案

FeeCalcService创建一个对象并使用该对象调用init()。然后使用同一对象调用 calculateFee,然后使用预期值和实际值进行验证。

关于java - 如何使用 Junit/Mockito 编写此费用计算器服务的测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52534430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com