我在我的服务层有一个方法:
public List<String> sortBarcodesByTotalPrice(Set<String> barcodesByBookType) {
List<String> toSort = new ArrayList<>();
for (String barcode : barcodesByBookType) {
[1] String combined = barcode + "/" + priceOperations.calculatePriceByBarcode(barcode);
toSort.add(combined);
}
[2] toSort.sort(new TotalPriceComparator());
return toSort;
}
[1]这一行获取条形码,比如“abc”
然后调用另一个类中的一个方法,该方法从数据库中检索有关该项目的信息,执行计算并返回价格。可能的组合
值可以类似于“abc/10”
。
[2]按价格对所有值进行升序排序。因此,如果列表包含和“def/15”
和“abc/10”
,则将其排序为[0]=“abc/10”
和[1]=“def/15”
。
当我尝试测试此方法时,当调用PriceOperations.CalculatePriceByBarcode(barode)
时,我得到空指针异常。我如何测试这个方法?我试着搜索并找到了一些关于使用mockito的问题和答案,但我不知道如何实现它。
我目前尝试测试此方法:
@Test
void sortBarcodesByTotalPrice() {
Set<String> toSort = new HashSet<>();
toSort.add("ABC/10");
toSort.add("DEF/5");
toSort.add("GHI/15");
List<String> sorted = bookService.sortBarcodesByTotalPrice(toSort);
assertEquals(sorted.get(0), "GHI");
assertEquals(sorted.get(1), "ABC");
assertEquals(sorted.get(2), "DEF");
}
编辑,解决方案:我已经想好了如何解决这个问题,感谢来自Kaj Hejer的信息。这是我的新测试方法,通过和工作按预期,如果我正确理解这一点:
@Test
void sortBarcodesByTotalPrice() {
PriceOperations priceOperations = Mockito.mock(PriceOperations.class);
Set<String> toSort = new HashSet<>();
toSort.add("GHI");
toSort.add("ABC");
toSort.add("DEF");
when(priceOperations.calculatePriceByBarcode("GHI")).thenReturn(new BigDecimal("15"));
when(priceOperations.calculatePriceByBarcode("ABC")).thenReturn(new BigDecimal("10"));
when(priceOperations.calculatePriceByBarcode("DEF")).thenReturn(new BigDecimal("5"));
BookService bookService = new BookService(null, null, priceOperations);
List<String> sorted = bookService.sortBarcodesByTotalPrice(toSort);
assertEquals(sorted.get(0), "DEF/5");
assertEquals(sorted.get(1), "ABC/10");
assertEquals(sorted.get(2), "GHI/15");
}
首先,您必须决定在哪里测试什么。您可能希望对BookService和PriceOperations类分别进行测试。现在你的测试正在测试这两个类。
如果要为BookService类编写测试,可以模拟PriceOperations类。
List<String> sorted = new ArrayList<>();
sorted.add("GHI");
sorted.add("ABC");
sorted.add("DEF");
PriceOperations priceOperations = Mockito.mock(PriceOperations.class);
when(priceOperations. calculatePriceByBarcode(Mockito.<String>anyList())).thenReturn(sorted);
当将PriceOperations注入到BookService构造函数中时,注入是一种聪明的注入方式,因为它使编写测试更加容易。然后,您可以将被嘲弄的priceOperations注入
BookService bookService = new BookService(priceOperations);
请让我知道这是否有用!
在这里,我只想确保抛出异常测试,但希望跳过调用方法在其中。我试着跟着走,但没有奏效
我们有一个相当复杂的对象,它是调用drools引擎的结果。对于JUnit测试我们的规则,我们创建了一个RulesTestHelper类,它提供了一个方法并对OurObject的元素执行许多断言(这可能通过编写我们自己的匹配器更好地解决,但我们还没有做到这一点)。 现在我想对这个方法进行JUnit测试,并断言当我将两个对象中的一个设置为“null”时,测试将失败。所以换句话说,我希望测试失败,这应该
问题内容: 因此,我敢肯定那里有类似的东西,但是我一直在寻找一个小时,却没有找到我真正想要的东西。说我有一堂课,看起来像这样: 我该如何做这样的工作? 问题答案: 使用Mockito,您可以像这样 监视真实对象 : 有一些陷阱,因此也请查看相关文档。
我创建了两个类:和。下面是进行计算的方法: 这里是一个调用并显示结果的函数,不幸的是,我无法根据这本书要求它运行的方式来运行它。 任何提示都会帮助我在我的再教育过程中。
我有一个层,称为,另一个称为。我想知道我是否可以强制执行一条规则,上面写着: 在参数列表包含名为foo的参数的服务层中的任何公共类的任何公共方法中,断言它从权限层调用方法(理想情况下,确保在服务层中的任何其他方法之前调用该方法)。 ArchUnit可以这样做吗?
问题内容: 在Bruce Eckel的“ Thinking In Java,第四版”的第428页(有关类型信息的章节)中,具有以下示例: 也许我有点累,但是我看不到add()方法中对add()的调用是如何工作的。我一直认为它应该有一个引用,或者是一个静态方法(并且我在ArrayList或List中找不到静态add())。我想念什么? 我只是为自己测试,发现这可行: 问题答案: Java为这样的方法