Junit测试是否进行了方法调用

时间:2015-01-27 07:46:09

标签: java unit-testing junit

我有一个具有验证方法的事务类。该方法中存在一种条件,当满足时将不会调用警报通知方法。仅当检查条件失败时才会调用警报通知方法(条件为false,调用警报并通知用户)。 我想从Junit测试中测试是否调用了该警报方法。有人可以建议如何继续,因为我是Junits的新手

4 个答案:

答案 0 :(得分:5)

看看模拟库。在Mockito,它会像

    Notifier mock = Mockito.mock(Notifier.class); 
    ClassUnderTest myClass = new ClassUnderTest(mock);
    myClass.doSomething(-1);
    Mockito.verify(mock).notification(Mockito.eq("Negative value passed!"));
    myClass.doSomething(100);
    Mockito.verifyNoMoreInteractions(mock);

答案 1 :(得分:2)

使用Mockito框架。这个框架使您的测试更容易。

您可以使用verify方法:

//Check if called once
verify(dependency, times(1)).yourMethod()

检查API以获取更多informations

答案 2 :(得分:1)

根据您的问题,目前尚不清楚警报通知方法是否属于您正在测试的同一类。

如果警报通知方法与您正在测试的方法不同,则可以使用像Mockito这样的模拟库来验证方法调用,如其他答案所示。

另一方面,如果通知方法与验证方法在同一类中是,我建议不要验证对通知方法的调用,而是验证此方法的输出(您可能也想使用模拟库,但要验证用于创建警报的任何其他对象的方法调用)

第三种可能性是两个方法都在同一个类中,但是你真的只想测试通知方法是否被调用而不是它的输出,因为你觉得通知是一个你想要单独测试的不同函数。这将表明您的类可能做了太多事情,并且最好重构,以便这些方法最终在不同的类中。

答案 3 :(得分:0)

在 2021 年末,我自己也是新手。但我找到了一种简单的方法来验证是否调用了不需要额外库的模拟。我不确定它是否“正确”,感觉也不完全“正确”,但足以满足我的需求。

// test/org/mycompany/MyScriptTests.groovy
// testing vars/MyScript.groovy

import org.junit.*
import com.lesfurets.jenkins.unit.*
import static groovy.test.GroovyAssert.*

class MyScriptTests extends BasePipelineTest {
  def MyScript

  @Before
  void setUp() {
    super.setUp()
    
    // set up mocks
    helper.registerAllowedMethod('functionToMock', [<param type>], { return 'a validation string' } )

    // load MyScript
    MyScript = loadScript("vars/MyScript.groovy")
  }

  @Test
  void aTest() {
    // set up mocks
    def myparam = 'myparam'

    // call MyScript and check result
    def result = MyScript(myparam)
    assert 'a validation string'.equals(result)

  }