我有一个使用当前时间进行一些计算的函数.我想用mockito嘲笑它.
我要测试的类的一个例子:
public class ClassToTest {
public long getDoubleTime(){
return new Date().getTime()*2;
}
}
Run Code Online (Sandbox Code Playgroud)
我喜欢这样的东西:
@Test
public void testDoubleTime(){
mockDateSomeHow(Date.class).when(getTime()).return(30);
assertEquals(60,new ClassToTest().getDoubleTime());
}
Run Code Online (Sandbox Code Playgroud)
有可能嘲笑吗?我不想更改"经过测试"的代码以便进行测试.
我想在我的Android项目中使用Mockito.我找到了非常好的教程来处理它:http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/
基本上它使用新版本的Mockito + Dexmaker,一切都按预期工作.
但是,当我尝试模拟一些Android特定对象时,即:
Context context = mock(Context.class);
Run Code Online (Sandbox Code Playgroud)
我收到这个例外:
java.lang.IllegalArgumentException:
dexcache == null (and no default could be found;
consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
Run Code Online (Sandbox Code Playgroud)
知道怎么解决吗?
UnfinishedVerificationException当我认为我已经完成了所有事情时,Mockito似乎正在投掷.这是我的部分测试用例:
HttpServletRequest req = mock(HttpServletRequest.class);
when(req.getHeader("Authorization")).thenReturn("foo");
HttpServletResponse res = mock(HttpServletResponse.class);
classUnderTest.doMethod(req, res); // Use the mock
verify(res, never());
verify(req).setAttribute(anyString(), anyObject());
Run Code Online (Sandbox Code Playgroud)
这是部分类和方法:
class ClassUnderTest extends AnotherClass {
@Override
public String doMethod(ServletRequest req, ServletRequest res) {
// etc.
return "someString";
}
}
Run Code Online (Sandbox Code Playgroud)
忽略你不应该模仿你不拥有的接口的事实,为什么Mockito给我以下信息?
org.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
-> at (redacted)
Example of correct verification:
verify(mock).doSomething()
Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
at [test method name and …Run Code Online (Sandbox Code Playgroud) 我有一个相当复杂的java函数,我想用jUnit进行测试,我正在使用Mockito来达到这个目的.这个函数看起来像这样:
public void myFunction (Object parameter){
...
doStuff();
...
convert(input,output);
...
parameter.setInformationFrom(output);
}
Run Code Online (Sandbox Code Playgroud)
函数convert根据输入设置输出的属性,它是一个void类型函数,尽管"output"参数正在被使用,就像它被函数返回一样.这个转换函数是我想要模拟的,因为我不需要依赖于测试的输入,但我不知道如何做到这一点,因为我对Mockito不是很熟悉.
我已经看到基本情况when(something).thenReturn(somethingElse)
或者我理解的doAnswer方法与前一个类似,但可以添加更多逻辑,但我不认为这些情况适合我的情况,因为我的函数没有返回声明.
我正在尝试测试一个服务类,它在内部使用Spring AMQP连接对象.此连接对象由Spring注入.但是,我不希望我的单元测试实际上与AMQP代理通信,因此我使用Mockito注入连接对象的模拟.
/**
* The real service class being tested. Has an injected dependency.
*/
public class UserService {
@Autowired
private AmqpTemplate amqpTemplate;
public final String doSomething(final String inputString) {
final String requestId = UUID.randomUUID().toString();
final Message message = ...;
amqpTemplate.send(requestId, message);
return requestId;
}
}
/**
* Unit test
*/
public class UserServiceTest {
/** This is the class whose real code I want to test */
@InjectMocks
private UserService userService;
/** This is a dependency of the real …Run Code Online (Sandbox Code Playgroud) 在使用RxJava和Retrofit 2时,我正在尝试创建单元测试以覆盖我的应用程序何时收到特定响应.
我的问题是,使用Retrofit 2,我无法看到一个很好的方法来创建一个不使用反射的retrofit.Response对象.
@Test
public void testLogin_throwsLoginBadRequestExceptionWhen403Error() {
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.get();
requestBuilder.url("http://localhost");
Response.Builder responseBuilder = new Response.Builder();
responseBuilder.code(403);
responseBuilder.protocol(Protocol.HTTP_1_1);
responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), "{\"key\":[\"somestuff\"]}"));
responseBuilder.request(requestBuilder.build());
retrofit.Response<LoginResponse> aResponse = null;
try {
Constructor<retrofit.Response> constructor= (Constructor<retrofit.Response>) retrofit.Response.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
aResponse = constructor.newInstance(responseBuilder.build(), null, null);
} catch (Exception ex) {
//reflection error
}
doReturn(Observable.just(aResponse)).when(mockLoginAPI).login(anyObject());
TestSubscriber testSubscriber = new TestSubscriber();
loginAPIService.login(loginRequest).subscribe(testSubscriber);
Throwable resultError = (Throwable) testSubscriber.getOnErrorEvents().get(0);
assertTrue(resultError instanceof LoginBadRequestException);
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用以下内容,但这会创建一个OkHttp响应与一个Retrofit响应.
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.get();
requestBuilder.url("http://localhost");
Response.Builder responseBuilder = new Response.Builder();
responseBuilder.code(403); …Run Code Online (Sandbox Code Playgroud) 我想知道Mockito是什么?
它是支持Junit还是编写Junit测试用例的环境?
有人可以解释一下Junit和Mockito之间的区别吗?
这将是一个简单的,但我找不到它们和使用哪一个,如果我有两个lib包含在我的类路径中?
我目前正在研究Mockito框架,并且我使用Mockito创建了几个测试用例.但后来我读到的不是调用模拟(SomeClass的的.class)我可以使用@Mock和@InjectMocks-我需要做的唯一一件事情就是我的注释测试类@RunWith(MockitoJUnitRunner.class)或使用MockitoAnnotations.initMocks(this);的@Before方法.
但它不起作用 - 似乎@Mock不会起作用!这是我的2个代码修订版 - 一个使用注释,一个没有.
我究竟做错了什么?
public class ReportServiceImplTestMockito {
private TaskService mockTaskService; // This is the Mock object
private ReportServiceImpl service;
@Before
public void init(){
service = new ReportServiceImpl();
mockTaskService = mock(TaskServiceImpl.class);
service.setTaskServiceImpl(mockTaskService);
}
/// ...
Some tests
}
Run Code Online (Sandbox Code Playgroud)
正如我所说 - 这项工作很棒.但以下不会:
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
// Some tests
}
Run Code Online (Sandbox Code Playgroud)
这是ReportServiceImpl班级:
@Service
public …Run Code Online (Sandbox Code Playgroud) 我有一个A类,它使用3个不同的类和自动装配
public class A () {
@Autowired
private B b;
@Autowired
private C c;
@Autowired
private D d;
}
Run Code Online (Sandbox Code Playgroud)
在测试它们时,我希望只有2个类(B&C)作为模拟,并且将D类自动装配为正常运行,此代码对我不起作用:
@RunWith(MockitoJUnitRunner.class)
public class aTest () {
@InjectMocks
private A a;
@Mock
private B b;
@Mock
private C c;
@Autowired
private D d;
}
Run Code Online (Sandbox Code Playgroud)
甚至可以这样做吗?