当前位置: 首页 > 知识库问答 >
问题:

测试调用另一个方法的方法

皇甫鸿远
2023-03-14

我在我的服务层有一个方法:

  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");
    }

共有1个答案

赖俊
2023-03-14

首先,您必须决定在哪里测试什么。您可能希望对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为这样的方法