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

如何模拟@Inject接口

秦锐
2023-03-14

我有这个服务接口

public interface ABC {
    public String getAbc();
}

我有一个使用这项服务的控制器

public class Do {
    @Inject ABC abc;

    public String doAbc() {
       String a = abc.getAbc();
    }
}

在我的单元测试中,我希望能够模拟这个ABC,而不必提供实际的实现。以下是有效的方法:

public class TestDo {
   @Mock
   private Do do;

   @Mock
   private ABC abc;

   @Before
   public void init() {
       MockitoAnnotations.initMocks(this);
       do.abc = abc;
   }

   @Test
   public void testDo() {
       when(do.doAbc()).thenCallRealMethod();
       do.doAbc();
       assertSomething...
   }
}

但我不想做的是do。abc=abc ,从我所有的搜索中,为了执行@InjectMock,我需要提供一个具体的类。有没有一种方法可以让我使用这个接口,但却能够将模拟接口注入do,而无需公开我的ABC Inject in do类?我想让ABC成为一个私有变量,并且仍然能够通过Mockito注入接口。


共有2个答案

孟安民
2023-03-14

您给出的示例是构造函数注入的一个完美案例:您可以将依赖项设置为私有(甚至是最终的,这在实际应用中总是可取的),并且仍然可以在不需要注入框架的情况下构建实例:

public class Do {
    private final ABC abc;

    @Inject
    public Do(final ABC abc) {
        this.abc = abc;
    }

    public String doAbc() {
       String a = abc.getAbc();
    }
}
皇甫学海
2023-03-14
public interface ABC {
    public String getAbc();
}

public class Do {

    @Inject
    ABC abc;

    public String doAbc() {
        System.out.println("Injected abc is " + (abc == null ? "null" : "not null"));
        return abc.getAbc();
    }

}


public class TestDo {
    @Mock
    private ABC abc;

    @InjectMocks
    private Do ddo;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void simpleTest() {
        System.out.println(ddo.doAbc());
    }

}

输出为:

Injected abc is not null
null
 类似资料:
  • 问题内容: 对于单元测试,我需要模拟几个依赖项。依赖项之一是实现接口的类: 我需要设置一个此类的模拟对象,当提供一些指定参数时,该对象将返回一些指定值。 现在,我不确定的是,模拟接口或类是否更好 与 在测试方面有什么不同吗?首选的方法是什么? 问题答案: 在您的情况下,可能不会有太大的区别,但是首选的方法是模拟接口,就像通常情况下,如果您遵循TDD(测试驱动开发),那么即使在编写实现类之前,也可以

  • CacheController.Somemethod();但是当submit方法被称为submit方法时,它会创建一个线程和cacheController.somemethod();从不调用测试类。

  • 当我运行测试时,我可以做什么来更改时间

  • null 我看过其他几个类似的问题,但没有一个有帮助: 模拟包含对SQLiteOpenHelper引用的类时出错 使用mockito库在java中模拟最终类-我在导入PowerMock时遇到了很多问题 如何用mockito模拟最后一个类-我已经添加了依赖项,并用行创建了文件,正如答案中所建议的那样,我仍然得到同样的错误。我还尝试了建议的答案,但这给了我一个‘没有足够的信息来推断类型变量t'erro

  • 我的要求是测试这段代码,更重要的是测试序列化器,因此,给出一个JSON片段,我如何测试所有的值都正确地通过商人的实例。 我不知道RestTemplate使用哪个序列化器将JSON序列化为对象。

  • 我知道Dan North设计BDD的意图之一是将词汇表从复杂的测试域中移开。然而,在实现由外到内的方法时,我们似乎仍然需要对模仿行为(或者,如果您愿意的话)有一些了解。North在这个视频中建议,如果我从最外层的域对象开始,然后向内工作,我会在发现合作者时模仿它们,然后用适当的实现替换它们。所以最后,我以一组端到端测试结束。 Martin Fowler在这篇博客文章中定义了TDD的两个阵营:“古典