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