标签: mockito

Mockito - 在void函数上的thenCallRealMethod()

您好我在尝试编写JUnit测试用例时遇到了问题,而且对Mockito来说相对较新.

我有一个我正在嘲笑的类的函数,这个函数碰巧是一个void返回类型.从我的模拟类中调用此函数时,我的理解(和调试经验)是它不调用原始函数.为了克服这个问题,我尝试使用"when"和"thenCallRealMethod()".

    when(instance.voidFunction()).thenCallRealMethod();
Run Code Online (Sandbox Code Playgroud)

"voidFunction"充满了我不想解雇的逻辑.为了避免这种情况,我已将这些提取到when语句中.我已经读过我应该使用的格式doReturn().when().voidFunction(),但这样做不会调用真正的方法.

这也是我的理解,我不能在这里使用Spy,因为我不希望在"when"语句之前调用voidFunction().任何帮助表示赞赏,如果这是一个非常简单的解决方案我很抱歉,因为尽管阅读了很多,但我对mockito的理解并不是很好.谢谢!

mockito

34
推荐指数
1
解决办法
2万
查看次数

如何使用OCMock验证方法永远不会被调用?

在我的日常工作中,我被Mockito的never()验证所破坏,这可以确认一个模拟方法永远不会被调用.

有没有办法用Objective-C和OCMock完成同样的事情?我一直在使用下面的代码,它可以工作,但感觉就像一个黑客.我希望有更好的方法......

- (void)testSomeMethodIsNeverCalled {
    id mock = [OCMockObject mockForClass:[MyObject class]];
    [[[mock stub] andCall:@selector(fail) onObject:self] forbiddenMethod];

    // more test things here, which hopefully
    // never call [mock forbiddenMethod]...
}

- (void)fail {
    STFail(@"This method is forbidden!");
}
Run Code Online (Sandbox Code Playgroud)

cocoa mocking objective-c mockito ocmock

33
推荐指数
3
解决办法
1万
查看次数

Mockito - 参数匹配器的使用无效

我有测试jms消息发送的Junit测试.我使用Spring jmsTemplate来做到这一点.在这里,我在下面的代码中,我想检查JMS模板是否已调用发送消息,无论它传递的actuall参数的值是什么.

我的发布者方法使用jmsTemplate发送方法看起来像跟在里面..

jmsTemplate.send(jmsQueueProperties.getProperty(key), new MessageCreator()
{
    public Message createMessage(Session session) throws JMSException
    {
        ObjectMessage obj = session.createObjectMessage(dialogueServiceResponse);
        return obj;
}
});
Run Code Online (Sandbox Code Playgroud)

在我的测试..

JmsTemplate mockTemplate = Mockito.mock(JmsTemplate.class);
...
publisher.publishServiceMessage(response);
....
Mockito.verify(mockTemplate, 
    Mockito.times(1)).send("appointment.queue", 
        Mockito.any(MessageCreator.class));
Run Code Online (Sandbox Code Playgroud)

但是当我执行时,我得到了

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数匹配器的使用无效!....

原因是由于Mockito.any(MessageCreator.class),但是没有办法测试我的send方法是在没有在MessageCreator中创建实际对象的情况下执行的.

更新 有没有办法检查我的session.createObjectMessage(dialogueServiceResponse)也被调用

junit unit-testing mockito

33
推荐指数
2
解决办法
6万
查看次数

无法解析符号PowerMockRunner

我第一次尝试使用Powermock

我使用build.gradle并添加:

dependencies {
...
    testCompile 'org.mockito:mockito-all:1.9.5'
    testCompile 'org.powermock:powermock-api-mockito:1.5.5'

}
Run Code Online (Sandbox Code Playgroud)

现在我看看我的测试类:

import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.powermock.core.classloader.annotations.PrepareForTest;


@RunWith(PowerMockRunner.class)
@PrepareForTest(GeoUtils.class)
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

@RunWith(PowerMockRunner.class)
             ^
cannot resolve symbol PowerMockRunner 
Run Code Online (Sandbox Code Playgroud)

怎么解决PrepareForTest而不是PowerMockRunner

java unit-testing mocking mockito powermock

33
推荐指数
4
解决办法
4万
查看次数

使用JUnit +的单元测试用例(Android中的Robolectric或Mockito或两者)

这是我第一次在Android中编写单元测试用例.

所以我搜索了很多东西.

  1. Robolectric framewordk - 在JVM上运行
  2. Mockito Framwork - 模拟物体

所以我对Robolectric和Mokito有些怀疑.

  1. 我是否必须在Android应用中仅使用Robolectric和JUnit?
  2. 我应该只在Android应用中使用Mockito吗?
  3. 我应该同时使用这两种框架吗?
  4. Mockito和Robolectric有什么区别?

我已经在寻找Mokito和Robolectric之间的区别,但没有得到任何正确的答案.

请建议.

android junit4 mockito robolectric

33
推荐指数
2
解决办法
7174
查看次数

的Mockito.验证方法参数是否为特定类

我有一个方法:

void putObject(<T extends BaseEntity> param)
Run Code Online (Sandbox Code Playgroud)

有一些测试,我嘲笑这个方法,但我想知道,如何验证该方法是否被特定类的参数调用?试图以这样的方式做到:

verify(foo).putObject((SomeClass)anyObject());
------
verify(foo).putObject(any(SomeClass.class));
------
ArgumentCaptor<SomeClass> parameter = ArgumentCaptor
            .forClass(SomeClass.class);
verify(foo).putObject(parametr);
Run Code Online (Sandbox Code Playgroud)

仅使用第二个变体any(),但它不t check class of参数` .那么,如果有可能验证该方法获得特定类的任何对象?

java unit-testing mockito

32
推荐指数
2
解决办法
2万
查看次数

Mockito:使用"thenReturn"中的方法返回模拟不起作用

我遇到了我认为可能是Mockito的错误,但是想知道是否有其他人可以解释为什么这个测试不起作用.

基本上,我有两个对象,如下所示:

public class FirstObject {
    private SecondObject secondObject;
    public SecondObject getSecondObject() { return secondObject; }
}

public class SecondObject {
    private String name;
    public String getName() { return name; }
}
Run Code Online (Sandbox Code Playgroud)

第一个对象通过注释和before方法进行模拟:

@Mock
FirstObject mockedFirstObject;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}
Run Code Online (Sandbox Code Playgroud)

第二个对象在一个方法中被模拟:

public SecondObject setupMockedSecondObject() {
    SecondObject secondObject = Mockito.mock(SecondObject.class);
    Mockito.when(secondObject.getName()).thenReturn("MockObject");
    return secondObject;
}
Run Code Online (Sandbox Code Playgroud)

thenReturn包含对此方法的直接调用以设置并获取第二个对象的模拟时,它将失败:

@Test
public void notWorkingTest() {
    Mockito.when(mockedFirstObject.getSecondObject()).thenReturn(setupMockedSecondObject());
    Assert.assertEquals(mockedFirstObject.getSecondObject().getName(), "MockObject");
}
Run Code Online (Sandbox Code Playgroud)

但是,当同一方法返回的模拟被分配给一个局部变量时thenReturn,它会起作用:

@Test
public void workingTest() {
    SecondObject mockedSecondObject = setupMockedSecondObject(); …
Run Code Online (Sandbox Code Playgroud)

java unit-testing mocking mockito

32
推荐指数
1
解决办法
3万
查看次数

多级@Mock和@InjectMocks

所以我理解在Mockito @InjectMocks中会注入@Mock的注释,但是如何处理这种情况呢?

@Mock
private MockObject1 mockObject1;

@Mock
private MockObject2 mockObject2;

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
Run Code Online (Sandbox Code Playgroud)

想象一下,MockObject2的属性类型为MockObject1,而SystemUnderTest的属性类型为MockObject2.我想将mockObject1注入mockObject2,并将mockObject2注入systemUnderTest.

这可能带注释吗?

java mockito

31
推荐指数
3
解决办法
3万
查看次数

被测单元:Impl还是接口?

假设我有实现它的接口和实现类,我想为此编写单元测试.我应该测试什么接口或Impl?

这是一个例子:

public interface HelloInterface {
    public void sayHello();
}


public class HelloInterfaceImpl implements HelloInterface {
    private PrintStream target = System.out;


    @Override
    public void sayHello() {
        target.print("Hello World");

    }

    public void setTarget(PrintStream target){
        this.target = target;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我有HelloInterface和HelloInterfaceImpl来实现它.什么是被测单元接口或Impl?

我认为它应该是HelloInterface.考虑下面的JUnit测试草图:

public class HelloInterfaceTest {
    private HelloInterface hi;

    @Before
    public void setUp() {
        hi = new HelloInterfaceImpl();
    }

    @Test
    public void testDefaultBehaviourEndsNormally() {
        hi.sayHello();
        // no NullPointerException here
    }

    @Test
    public void testCheckHelloWorld() throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream(); …
Run Code Online (Sandbox Code Playgroud)

java unit-testing dependency-injection mockito

31
推荐指数
3
解决办法
2万
查看次数

如何启用Mockito调试消息?

如何启用Mockito调试消息?特别是,我想打印存根的方法的细节when()以及与这些方法的每次交互.

java testing debugging mockito

31
推荐指数
2
解决办法
1万
查看次数