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

使用mockito powermokito的Mock重写方法

宰父保臣
2023-03-14

我想通过模拟classB1的重写方法a1方法2来测试我的服务。我不想更改课程A1和B1中的任何内容。我使用的是mockito 1.9.0和powermockito 1.4.12。我正在尝试以下代码:

UnitTestService类:

import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.testng.Assert;
import org.testng.annotations.Test;

public class UnitTestService {

    @Mock
    B1 b1;
    @InjectMocks
    Service service = new Service();

    @Test
    public void testB1Method2() throws Exception {
        MockitoAnnotations.initMocks(this);
        when(b1.a1Method2()).thenReturn("mockvalue");
        PowerMockito.whenNew(B1.class).withArguments(Mockito.any()).thenReturn(b1);
        String output = service.serviceMethod();
        System.out.println("=====" + output);
        Assert.assertTrue("mockvalue".equalsIgnoreCase(output), "testA1Method2 failed!");
    }

}

服务级别:

public class Service {

    public String serviceMethod() {
        B1 b1 = new B1("some data");
        return b1.a1Method2();
    }

}

A1类:

public abstract class A1 {

    public A1(String data) {
        //doing many thing with data
    }

    public String a1Method1() {
        return "from a1Method1";
    }

    public String a1Method2() {
        return "from a1Method2";
    }

}

B1级:

public class B1 extends A1 {

    public B1(String data) {
        super(data);
    }

    @Override
    public String a1Method1() {
        return "a1Method1 from B1 class";
    }

}

我正在eclipse中使用testNG运行类UnitTestService。在这里,B1类a1Method2中的实际方法在控制台中打印“====来自a1Method2”时被调用。ie:在这里,mockito似乎无法模仿这种方法。

我应该在UnitTestService类中进行哪些代码更改以模拟类B1a1omeod2

共有1个答案

温镜
2023-03-14

您在那里创建了难以测试的代码,完全没有什么好的理由。让你头疼的是,在你的服务课上给新B1打了一个小小的电话。

如果要对该对象使用依赖项注入;那么您就完全不需要处理powermock和Mock继承的方法。因为你可以简单地创建一个“模拟”B1;将其传递给您的服务;然后,您可以完全控制测试期间将发生的事情。

因此,这里可行的替代方案可能是通过简单地改进您的生产代码以更容易测试来避免复杂的测试设置。

观看这些视频可以更好地理解我在说什么!

 类似资料:
  • 我有这两种方法,在使用Mock实现测试时遇到了困难。我该如何参加考试? 我有麻烦得到Jboss目录而不必启动System.get属性(jboss.server.temp.dir);

  • 本文向大家介绍使用Codeigniter重写insert的方法(推荐),包括了使用Codeigniter重写insert的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 使用Codeiginter 框架插入数据时有唯一索引键值存在解决办法 对数据进行存储的时候,会有一些唯一索引的字段已经有值了,插入数据的时候会失败我们通常解决办法是先查询这个值是否存在,存在就跟新update,不存在就ins

  • 当实现Comparable接口并重写compareTo方法时, 第三行,我意识到当我重写它时,我可以使用compareTo,它会自动按照自然顺序进行比较。但是在可比较的界面中,它不是一个抽象的方法。没有定义它,它还可以比较吗?还有,为什么我不需要使用super关键字来区分这个比较。

  • 问题内容: 基本上,这就是我要实现的目标。 classname @ address(?)[原始],对象的名称,对象的年龄 问题,被递归调用。 我不能打电话,因为那不是我想要的。我想叫原件。 这个 由于明显的原因而无法正常工作。 我已经精疲力竭了,一旦方法被重写,可以做到这一点吗?即所谓的原始实现? (我的编辑)基本上,我需要的是:覆盖toString以显示’this’对象的两个属性,并且我也想让’

  • 我试图覆盖add(),但它不会编译 错误消息 java:36:错误:名称冲突:AVLTree中的add(E#1)和BinaryTree中的add(E#2)具有相同的擦除,但两者都不重写另一个公共void add(E toInsert)^,其中E#1、E#2是类型变量:E#1扩展了在类AVLTree中声明的Comparable E#2扩展了在类BinaryTree中声明的Comparable

  • subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA: