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

使用JUnit,我如何模拟调用某个受保护方法的公共构造函数?

荀俊迈
2023-03-14

在我的代码中,我有lineItems.getList()在该类中调用受保护的方法。

public class Itemized {
    List<String> itemList = new ArrayList<String>();
    public void execute {
        try {
            //Establish some logic here
            Items lineItems= new Items (order1, order2);
            itemList = lineItems.getList();
        }
        catch (Exception e) {
          .....
        }
        finally {
            (if itemList !=null && !itemList.isEmpty()) {
                //do something here
        }

这是我的测试案例

@Mock
private Items items = Mockito.mock(Items.class);  
@Injectmocks
Itemized itemized;  

@Test
public void testItemized() throws Exception {
    List<String> mockItemList = new ArrayList<String>();
    mockItemList.add("ABC");
    mockItemList.add("DEF");
    PowerMockito.whenNew(Items.class).withAnyArguments().thenReturn(items);
    PowerMockito.when(items.getList()).thenReturn(mockItemList);
    mockItemList = items.getList();
    itemized.execute();
}

当我试图建立一个系统时。出来打印测试用例中的mockTestList,返回列表。然而,在我的逐项分类中,它总是返回空的,因此,它永远不会到达finally块。

更新这里是我试图模拟的类

public class Items {
    private List<String> items = new ArrayList<String>();
    public List<String> getList() {
        return items;

    .....
    //other protected methods that call addItems
    ......

    private void addItems(String item) {
    items.add(item);
    }
]

我对单元测试还相当陌生,所以可能我在这条线上的某个地方错误地嘲笑了它。

共有1个答案

翟嘉年
2023-03-14

你能试试这个吗:

@Mock
private Items items;  
@Injectmocks
Itemized itemized = new Itemized();  

@Before
public void setup(){
    Mockito.initMocks(this);
}
@Test
public void testItemized() throws Exception {
    List<String> mockItemList = new ArrayList<String>();
    mockItemList.add("ABC");
    mockItemList.add("DEF");
    PowerMockito.whenNew(Items.class).withAnyArguments().thenReturn(items);
    PowerMockito.when(items.getList()).thenReturn(mockItemList);
    //mockItemList = items.getList();
    itemized.execute();
}

如果你忘记了Mockito。(这个) 这将是根本原因。

 类似资料:
  • 我正在使用Mockito 1.9.5。我如何嘲笑从受保护的方法返回的内容?我有这个受保护的方法... 然而,当我尝试在JUnit中这样做时: 在最后一行,我得到一个编译错误“方法‘myMethod’不可见”如何使用Mockito来模拟受保护的方法?如果答案是这样,我愿意升级我的版本。

  • 我尝试模拟父类的受保护方法。因此,我使用&。我的家长班。

  • 当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?

  • 问题内容: 当我用方法覆盖方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法? 问题答案: 子类始终可以扩大访问修饰符,因为它仍然是超类的有效替代。从Java规范中有关覆盖和隐藏的需求: 覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与覆盖或隐藏方法相同的访问权限,如下所示: 如果覆盖或隐藏方法是公共的,则覆盖或隐藏方法必须是公共的;否则,将发

  • 我们目前使用Mockito+PowerMock作为我们的主要模仿框架,并且在开始将一些代码转移到Java8时遇到了一些问题。因此,我们决定将jMockit作为一种替代方案进行评估。我对嘲笑概念有相当好的理解,但我承认我对jMockit的经验非常有限。 然而,我在测试一些在我看来应该是非常基本的东西时遇到了问题:被测试的类在其构造函数中使用New创建其他类的实例。我想让这个新调用返回一个模拟实例。

  • 我希望Hibernate能够使用受保护的无参数构造函数实例化类,然而,我们得到了:。 更改自: 致: 问题已经解决了。我们使用的Hibernate版本:3.6.10.final。 对于什么时候无参数构造函数必须是而不是才能使Hibernate工作,是否有任何规则?