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

@injectmocks是如何工作的

万俟宜修
2023-03-14

从@mock和@injectmocks之间的差异,我理解@injectmocks被用作创建实例的注释,并将用@mock创建的mock注入其中。我想我不明白它是怎么工作的。

public interface SimpleAgenda {

    public List<String> getAppointments();

    public String getAppointment(Date d);

    public void addAppointments(Date d, String label);

}
public class MyAgenda implements SimpleAgenda {

    private Map<String, String> appointments;

    @Override
    public List<String> getAppointments() {
        List<String> lst = new ArrayList<String>();
        System.out.println(this.appointments == null);
        for (String key : this.appointments.keySet()) {
            String label = this.appointments.get(key);
            lst.add(label);
        }

        return lst;
    }

    @Override
    public String getAppointment(Date d) {
        String dateString = d.toString();
        String app = this.appointments.get(dateString);
        
        return app;
    }

    @Override
    public void addAppointments(Date d, String label) {
        // TODO Auto-generated method stub
        // this behavior is not implemented yet in this class
    }

}
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class AgendaTest {

    private static final String LABEL = "This is a mock appointment for: ";

    // @InjectMocks annotation is used to create and inject the mock object
    @InjectMocks
    MyAgenda agenda = new MyAgenda();

    // @Mock annotation is used to create the mock object to be injected
    @Mock
    Map<String, String> mockedAppointments;

    @Before
    public void createMocks() {
        Date d1 = (new GregorianCalendar(120, 4, 15)).getTime();
        Date d2 = (new GregorianCalendar(119, 7, 31)).getTime();

        String key;

        key = d1.toString();
        // add the mocked behavior of for a set of given dates
        when(mockedAppointments.get(key)).thenReturn(LABEL + key);

        key = d2.toString();
        // 1. add the mocked behavior of for a set of given dates.
        // 2. Strict stubbing that requires that all declared stubs are actually used
        //    the statement lenient() relax this requirement. Check the manual. 
        lenient().when(mockedAppointments.get(key)).thenReturn(LABEL + key);

        when(mockedAppointments.size()).thenReturn(2);
    }

    @Test
    public void mockTest() {
        for (String key : mockedAppointments.keySet()) {
            String v = mockedAppointments.get(key);
// Do not worry, we will never reach this line. We are querying the object on 
// method that was not mocked (i.e. keySet).            
            Assert.fail();
        }

        int size = mockedAppointments.size();

        Assert.assertEquals(2, size);
    }

    @Test
    public void simpleTest() {
        int appCounter = agenda.getAppointments().size();
// Do not expect that appCounter is 2 (or more in general different than 0) ... 
// we are actually querying an object that was not mocked!!!
// See the details of the implementation of the method: MyAgenda.getAppointments()
        Assert.assertEquals(0, appCounter);
    }

以下是我的问题:

  1. mocktest()中,当我调用mockedappointments.keyset()时,它返回一个空集...我的问题是:为什么mockedAppointments.keyset()不抛出nullpointerexception(只声明mockedappoinceptions)?也许因为这是一个嘲弄?如果原因是这样,为什么模拟不抛出“NullPointerException”?
  2. simpletest()中,我们有agenda.getpartications().size();Agenda.getDartications()包含system.out.println(this.aptications==null);和这行打印“false”是我保留@injectmocks注释,否则为“true”,但为什么?在第一种情况下(@injectmocks被保留),“议程”的“约会”属性在哪里初始化?它被初始化是因为我们将mocked约会的值注入其中吗?如果是,那么Mockito是否只根据测试类中定义的模拟类型和MyAgenda中定义的属性类型来执行此操作?

共有1个答案

曾涵育
2023-03-14
  1. qn为什么mockedAppointments.keyset()不抛出nullPointerException(只声明mockedappoinctions)?也许因为这是一个嘲弄?如果原因是这样的话,为什么模拟不抛出“NullPointerException”呢?
    答案是:因为mockedappointments.keyset().size是0并且mockedappointments.keyset()是空的,所以这是模拟的行为
  2. 2.0Qn system.out.println(this.appings==null);行打印“false”是我保留@injectmocks注释,否则“true”,但为什么呢?
    答案是:在junit或mockito System.out.println中不起作用,而是使用logger。
    2.1Qn在第一种情况下(@injectmocks被保留)“议程”的“约会”属性在哪里初始化?
    答案是:它是在嘲笑类,例如列表,它初始化为0,并将值保持为空,除此之外
@InjectMocks
private MyAgenda agenda;

应该像这样声明
2.2Qn它初始化是因为我们向它注入了mockeddartications的值吗?
答案是:mockeddappences和议程没有任何联系,除此之外,这个injectMocks您可以使用@mocks,它是有效的。

 @Mocks
 private MyAgenda agenda; 
 类似资料:
  • 应用程序具有上下文路径-->/spring-form-simple-project 因此,为了访问,我使用: 这个控制器又返回student.jsp,当提交这个student.jsp时,它用-->@RequestMapping(value=“/AddStudent”,method=RequestMethod.post)调用controller 任何关于这通常如何工作的指示都将是有帮助的。 谢谢!

  • 本文向大家介绍hibernate 是如何工作的?相关面试题,主要包含被问及hibernate 是如何工作的?时的应答技巧和注意事项,需要的朋友参考一下 读取并解析配置文件。 读取并解析映射文件,创建 SessionFactory。 打开 Session。 创建事务。 进行持久化操作。 提交事务。 关闭 Session。 关闭 SessionFactory。

  • 我很想知道谷歌应用商店服务中的Activity认可是如何工作的? 我认为活动是通过加速计数据识别的。是这样吗?。请告诉我详细情况如何

  • 我对GridBagLayout这一主题不熟悉,我无法理解约束、重量和填充之间的确切区别。 我可以而不分配。 除非您指定了至少一个非零值,否则所有组件都会聚集在其容器的中心。这是因为当权重为0.0(默认值)时,GridBagLayout会在其单元格网格和容器边缘之间放置任何额外的空间。 我的问题是,如果这是真的,那么为什么组件之间没有空间,它们看起来是连接的?

  • 这可能是一个很难回答的问题。我才刚开始学Java 我不懂paintComponent方法的操作。我知道如果我想画一些东西,我必须重写paintComponent方法。

  • 我观看了Walter Brown在Cppcon14上关于现代模板编程的演讲(第一部分,第二部分),他介绍了他的SFINAE技术。 示例: 给定一个简单的变量模板,如果所有模板参数都格式良好,则计算结果为: 存在 格式良好 有效,并计算为 2. 不存在 格式错误,以静默方式失败(sfinae) ,因此丢弃此模板