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

测试使用JUnit和Mockito在方法中创建对象的方法

屈健柏
2023-03-14

您好,我对Junit和Mockito的单元测试相当陌生。我认为我对这些原则有一个相当合理的理解,但我似乎找不到任何解释来解释我特别想在网上测试什么。

我想测试一个方法,它调用其他几个方法(void和non-void),该方法还实例化了方法体中的对象。不幸的是,我不能分享代码,因为它不是我的,但这里有一个通用格式:

class classToTest {
     private final field_1;

     public void methodToTest( string id, List object_1, List object_2) {
          try {
               Map<SomeObject_1, SomeObject_2> sampleMap = new HashMap<>();
               method_1(object_1, object_2); //void function modifies object_2
               field_1.method_2(id, object_2);
               Map<SomObeject_1, List<object>> groupedList = groupList(object_2)
               //Then some stuff is added to the sampleMap
          }
          //catch would be here
}

目前我只关心测试method_1,我不能直接测试,因为它是一个私有方法,所以我必须通过这个父方法调用。我希望我能改变代码,但我被要求保持不变,并以这种方式用Mockito和JUnit进行测试。

我知道我需要模拟要测试的类的对象及其参数:

private classToTest classToTestObject;
@Mock private field_1 f1;

@Before
public void setup() {
     MockitoAnnotations.init.Mocks(this);
     classToTestObject = mock(classToTest.class, CALLS_REAL_METHODS);
}

但我不知道从哪里开始我的实际测试,因为我基本上可以只执行一个方法调用,而忽略所有其他方法调用。我不能忽略其他对象和方法调用,因为如果处理不当,主方法将抛出异常。

非常感谢您的帮助和指导,很抱歉我不能分享代码。非常感谢。

共有1个答案

姬温文
2023-03-14

目前我只关心测试方法_1,我不能直接测试,因为它是一个私有方法,所以我必须完成这个父方法调用。

根据您的评论和代码中的注释:

method_1(object_1, object_2); //void function modifies object_2

您将设置一个测试,允许您验证对象2的预期最终状态。您可以使用该类的真实实例,而不是模拟实例来执行此操作。

@Test
public void method1Test() {
    // Assemble - your preconditions
    ClassToTest subject = new ClassToTest();
    List<SomeType> object_1 = new ArrayList();
    List<SomeOtherType> object_2 = new ArrayList();

    // Populate object_1 and object_2 with data to use as input
    // that won't throw exceptions. Call any methods on subject that put
    // it in the desired state

    // Act - call the method that calls the method under test
    subject.methodToTest("some id that makes the method run correctly", object_1, object_2);

    // Assert - one or more assertions against the expected final state of object_2
    assertThat(object_2).matchesYourExpectations();
}
 类似资料:
  • 到今天为止,我一直在研究单元测试,遇到了一个障碍。我有一个给定的方法,我想用unittest测试,这个方法可能有错误,也可能没有错误。方法如下: 此方法应该输出由两个时间跨度的重叠时间构造的新时间跨度。我为此方法编写了一个单元测试,如下所示: 为了相互比较对象,我重写了TimeSpan类中的equals方法,如下所示: 查看测试中给定的时间跨度,我希望测试能够通过,但正如您所猜测的那样,它没有通过

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

  • 第二个类有一个简单的方法,它只返回一个字符串,该字符串作为参数传递给该方法 现在有一个Sample类,我在Sample Classe的方法中调用了这个show方法并返回字符串。 现在我正在测试示例类,因此我创建了一个名为SampleTest的文件

  • 我的控制器 这是我的控制器测试用例 我正在将User对象转换为string并将其发布到控制器方法。我正在尝试模拟userService.validateUser()将返回新的空User对象的服务方法。由于发布到service方法的对象和控制器接收到的对象不同,所以service返回null。如何让service方法返回空用户对象?

  • 我试图将EasyMock与JUnit一起使用,但在对JUnit4方法中的模拟依赖项调度方法调用时遇到了困难。 在下面的示例中,测试类正在测试类。被传递到的构造函数,在构造函数中调用的方法之一,返回初始化所需的值。初始化的过程对所有测试都是相同的,所以我用JUnit4注释修饰方法。 在测试方法时,我们期望调用mock实例以返回一个值,我们在方法中调度该值。但是,这个测试意外失败,出现错误,尽管这个调