How do I mock JoinRow for unit testing - unit-testing

I have looked at code base of jdbi v3 but still can't figure out a way to mock Stream<JoinRow> returned by Dao class.
Constructor is package protected which is only invoked from JoinRowMapper's specialize function which itself needs StatementContext.
Is there any way to mock JoinRow object for unit testing purposes?
Thanks in advance.

Not clear, why you need to mock Stream<JoinRow>. But if you can't mock it, you can spy it :) Just, use Mockito Spy, or Spring #SpyBean depending on your context.
However, Jdbi has pretty good support for testing without mocking anything - just by using embedded DB (like H2) and JdbiRule.
Also, there are good examples of Jdbi tests in their Git repo. Specifically for Stream.
Hopefully, this answer clarifies something.

Related

How is Jmockit different from EasyMock? Which is better to use?

I have for long worked on EasyMocking in JUnits. I am pretty much comfortable with this but now I want to know how EasyMocks are different from Jmockits. I tried going through their documentation and I found out that the syntax is a bit different. But yet I could not figure out if there is any difference in their performances.
Can anyone help me figure out what are the points that make either of them better than the other? Is there any special element in JMockit that is not found in the other?
Thanks in advance...
There are many differences between JMockit and EasyMock/jMock/Mockito/PowerMock.
These are the major ones:
Support for integration testing: JMockit supports an out-of-container integration testing approach, similar to what the Spring Test module provides, but also supporting Java EE. The other mocking libraries only support isolated unit testing with mock objects.
A "faking" API (see also in xUnit Patterns), in addition to the mocking API. Each one of the other mocking libraries only have a mocking API.
Full support for "mocking", in addition to "mock objects". Other mocking libraries work with mock objects which they create and which need to be passed in somehow to the code under test. With EasyMock/jMock/Mockito, static methods, constructors, and "new-ed" objects cannot be mocked at all. PowerMock supports full mocking as well, but still focused on mock objects (specifically, new-ed objects must be "replaced" with mock objects through whenNew recording, while with JMockit a test can simply declare a #Mocked field).
Support for mocking/faking of final classes and methods. Only PowerMock also provides this support. Mockito recently added an "inline mock maker" which adds support for finals, but it's not active by default and may not be as reliable.
Support for mocking/faking of unspecificied subclasses and interface implementations (where the test only declares a base type to be mocked/faked).
In the mocking API, expectations on methods with multiple parameters can be recorded/verified with argument matchers (such as anyString, etc.) only for some parameters, while other mocking APIs require such matchers for every single parameter.
Also in the mocking API, expectations can be explicitly verified after the tested code was exercised, just like in Mockito. EasyMock/jMock do not support this verification model.
As for performance, mocking a type with JMockit (done through class redefinition) probably has a higher runtime overhead when compared to creating a mock object with EasyMock/jMock/Mockito (done through subclass definition), and lower when compared with PowerMock (done through class definition on a custom classloader). However, you should only notice the difference in performance if there is a lot of mocking being done, which most likely indicates overuse of mocking.
You can find a blog post about the differences between them (and also mockito!) here: http://www.baeldung.com/mockito-vs-easymock-vs-jmockit
While they all have different syntax and different ways of working, you should be able to achieve whatever you need in regards to mocking with either framework.

Mocking in Qunit

How do we mock a method in Qunit. I have a situation where I need to mock some methods and return some value. For example I have a function which internally calls the getBrowser() function. I want to mock the get browser and pretend as if it is returning a value of "Chrome". Also is there a way of mocking the objects or variables.For example, is there a way of mocking navigator.userAgent? Thanks in anticipation.
I don't think there is a way of mocking functions by default in QUnit, but you can try some plugins. Never tried them myself, but this page references a few mocking tools :
QUnit Plugins

Testing listeners in Laravel 5.1

Is there an standard way to unit test Listeners in Laravel 5.1 (not mocking the Event::fire()) or do you just instantiate it, call handle() with mocked params and make assertions, the oldschool way?
I read Events and Testing and it doesn't really says anything about unit testing listeners.
AFAIK it's totally up to you and your preferences. You could do either of the two approaches mentioned, but I actually don't test them at all. Instead I try to have only a very basic code in the Listener, and move all the logic into separate services. IMHO that makes code easier to understand and cleaner to unit test without mocking the hell out of it.

Moq and Concrete Dependencies in ASP.NET MVC 2

I'm working on an ASP.NET MVC 2 project. I've been handed a few controller classes with a tight dependency on a data repository class, something like this:
public class MyController : Controller
{
MyRepository myRepository = new MyRepository();
// ...
}
Class MyRepository is concrete, not an interface.
Basically, while I have read access to this code I don't have write access. I'm trying to write some unit tests to make sure it works. Needless to say I don't want to have the actual database get hit as I do this, so clearly some sort of mocking is in order.
I'm fairly new to unit testing and mocking, but I've read up on Moq and I think I get the basic idea of how it works. I've been able to successfully create a simple mock repository object... but the problem is, I still don't know how to pass it into the class!
If I'd written the original code I would have used an interface rather than a concrete class, and I would have written an extra constructor for dependency injection. As it is, I'm in a mess.
Can Moq help me pass it into the class (if I mock MyController), or do I need to petition for write access so I can refactor?
I would recommend you to ask write access and change the code to use constructor injection. Everything else would be hacks which won't bring much value to this code. As long as a class has strong coupling with some other class it is close to impossible to unit test and even if you find some method this test will be so brittle that it would be a waste of time.
You are correct in that to do this properly you need to have a public way of injection your own mock of the repository. Moq will not help you here. You should try to change the MyController code to enable this kind of dependecny injection.
If you cannot chagne the code, you could always change things using private reflection. But doing this fragile because a change in the controllers implementation can break your tests.
Of course, then you need to figure out how to mock the repository. If it was not designed for mocking then something like Moles could work

What is wrong with Stubs for unit testing?

I just watched this funny YouTube Video about unit testing (it's Hitler with fake subtitles chewing out his team for not doing good unit tests--skip it if you're humor impaired) where stubs get roundly criticized. But I don't understand what wrong with stubs.
I haven't started using a mocking framework and I haven't started feeling the pain from not using one.
Am I in for a world a hurt sometime down the line, having chosen handwritten stubs and fakes instead of mocks (like Rhinomock etc)? (using Fowler's taxonomy)
What are the considerations for picking between a mock and handwritten stub?
There is nothing wrong with stubs, there is room for stubs, mocks... and spies. All are "test doubles", but with different purposes as explained in Mocks and Stubs aren't Spies:
[...] Before moving on, I'd like to
clarify and define some terms in use
here, which I originally discovered in
Gerard Meszaros' xUnit Patterns
book.
A Dummy Object is a placeholder object passed to the system under test
but never used.
A Test Stub provides the system under test with indirect input
A Test Spy provides a way to verify that the system under test performed
the correct indirect output
A Mock Object provides the system under test with both indirect input
and a way to verify indirect output
[...] And you can let this handy chart
guide your decisions:
PS: Mockito - The New Mock Framework on the Block is worth the read too.
I use the following terminology (introduced by Roy Osherove, the author of the Art of Unit-Testing):
A fake is called a stub if you tell it to fake something in case a method is called with such and such parameters. But if you also verify that such call actually took place or took place exactly N times, then such fake is called a mock. In short. a fake is a stub unless you call Verify() on it and then it's a mock.
Obviously, you will need to use stubs in some cases and mocks in others. So, criticizing stubs roundly is probably wrong and using stubs exclusively is probably wrong as well.
If you haven't started using a mocking framework (alternative term: isolation framework), you should keep an eye on them and reevaluate your options frequently. I went from manual mocks to NMock2 to Moq very quickly. Here's an interesting poll of programmers that shows what they use. Manual mocks/stubs are in the minority, but aren't that uncommon.
Mocks are just a lot easier to throw in. They are a real instance of your class, pre-stubbed with the ability to override the action of any method with minimal boilerplate.
There are lots of little considerations such as: If you don't want to deal with any of the methods, you can either have it act as a no-op or fail the test--your choice--but either way virtually no code.
How much boilerplate do you get when you stub out a class? How do you handle it if your class is final? Do you play tricks to get your stub on the classpath first, or do you use different source?
I recommend just starting with the mocks--It's easier all around.
There is nothing wrong with using stubs instead of mocks.
If you want to get technical, mocks are "smart" objects with expectations that can be verified. Stubs are dummy objects that return preset values. See Mocks Aren't Stubs.
But many people (myself included) prefer to do state testing with stubs rather than behavior testing with mocks. You inject a stub into the class under test, you call a method, then you check the state of the class under test. It tends to make for less brittle tests than asserting that the class's internals called method X of a mock object with argument Y.
I don't think you're in for a world of hurt. If you haven't started feeling the pain, you probably don't need an isolation/mocking framework yet. When and if you do, having handwritten stubs/fakes around isn't going to hurt anything.
If you have a lot of interfaces, or if your interfaces have a lot of methods, an isolation/mocking framework can save a lot of time over hand-coding stubs.
I like Moq a lot; I find it easier to use than Rhino Mocks for creating stubs.
Mocks and stubs is used to achieve a real unit test. You just mock all the dependencies, and unit test your class in isolation.
I'm currently using MOQ for mocking and stubbing.