您好我在尝试编写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的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) 我有测试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)也被调用
我第一次尝试使用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?
这是我第一次在Android中编写单元测试用例.
所以我搜索了很多东西.
所以我对Robolectric和Mokito有些怀疑.
我已经在寻找Mokito和Robolectric之间的区别,但没有得到任何正确的答案.
请建议.
我有一个方法:
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参数` .那么,如果有可能验证该方法获得特定类的任何对象?
我遇到了我认为可能是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) 所以我理解在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.
这可能带注释吗?
假设我有实现它的接口和实现类,我想为此编写单元测试.我应该测试什么接口或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) 如何启用Mockito调试消息?特别是,我想打印存根的方法的细节when()以及与这些方法的每次交互.
mockito ×10
java ×6
unit-testing ×5
mocking ×3
android ×1
cocoa ×1
debugging ×1
junit ×1
junit4 ×1
objective-c ×1
ocmock ×1
powermock ×1
robolectric ×1
testing ×1