Best Mockito code snippet using org.mockitousage.customization.BDDMockitoTest.should_stub
Source: BDDMockitoTest.java
...24public class BDDMockitoTest extends TestBase {25 @Mock26 IMethods mock;27 @Test28 public void should_stub() throws Exception {29 BDDMockito.given(mock.simpleMethod("foo")).willReturn("bar");30 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("bar");31 Assertions.assertThat(mock.simpleMethod("whatever")).isEqualTo(null);32 }33 @Test34 public void should_stub_with_throwable() throws Exception {35 BDDMockito.given(mock.simpleMethod("foo")).willThrow(new BDDMockitoTest.SomethingWasWrong());36 try {37 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");38 Assert.fail();39 } catch (BDDMockitoTest.SomethingWasWrong expected) {40 }41 }42 @Test43 public void should_stub_with_throwable_class() throws Exception {44 BDDMockito.given(mock.simpleMethod("foo")).willThrow(BDDMockitoTest.SomethingWasWrong.class);45 try {46 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");47 Assert.fail();48 } catch (BDDMockitoTest.SomethingWasWrong expected) {49 }50 }51 @Test52 @SuppressWarnings("unchecked")53 public void should_stub_with_throwable_classes() throws Exception {54 // unavoidable 'unchecked generic array creation' warning (from JDK7 onward)55 BDDMockito.given(mock.simpleMethod("foo")).willThrow(BDDMockitoTest.SomethingWasWrong.class, BDDMockitoTest.AnotherThingWasWrong.class);56 try {57 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");58 Assert.fail();59 } catch (BDDMockitoTest.SomethingWasWrong expected) {60 }61 }62 @Test63 public void should_stub_with_answer() throws Exception {64 BDDMockito.given(mock.simpleMethod(ArgumentMatchers.anyString())).willAnswer(new Answer<String>() {65 public String answer(InvocationOnMock invocation) throws Throwable {66 return invocation.getArgument(0);67 }68 });69 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");70 }71 @Test72 public void should_stub_with_will_answer_alias() throws Exception {73 BDDMockito.given(mock.simpleMethod(ArgumentMatchers.anyString())).will(new Answer<String>() {74 public String answer(InvocationOnMock invocation) throws Throwable {75 return invocation.getArgument(0);76 }77 });78 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");79 }80 @Test81 public void should_stub_consecutively() throws Exception {82 BDDMockito.given(mock.simpleMethod(ArgumentMatchers.anyString())).willReturn("foo").willReturn("bar");83 Assertions.assertThat(mock.simpleMethod("whatever")).isEqualTo("foo");84 Assertions.assertThat(mock.simpleMethod("whatever")).isEqualTo("bar");85 }86 @Test87 public void should_return_consecutively() throws Exception {88 BDDMockito.given(mock.objectReturningMethodNoArgs()).willReturn("foo", "bar", 12L, new byte[0]);89 Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo("foo");90 Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo("bar");91 Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo(12L);92 Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo(new byte[0]);93 }94 @Test95 public void should_stub_consecutively_with_call_real_method() throws Exception {96 MethodsImpl mock = Mockito.mock(MethodsImpl.class);97 BDDMockito.willReturn("foo").willCallRealMethod().given(mock).simpleMethod();98 Assertions.assertThat(mock.simpleMethod()).isEqualTo("foo");99 Assertions.assertThat(mock.simpleMethod()).isEqualTo(null);100 }101 @Test102 public void should_stub_void() throws Exception {103 BDDMockito.willThrow(new BDDMockitoTest.SomethingWasWrong()).given(mock).voidMethod();104 try {105 mock.voidMethod();106 Assert.fail();107 } catch (BDDMockitoTest.SomethingWasWrong expected) {108 }109 }110 @Test111 public void should_stub_void_with_exception_class() throws Exception {112 BDDMockito.willThrow(BDDMockitoTest.SomethingWasWrong.class).given(mock).voidMethod();113 try {114 mock.voidMethod();115 Assert.fail();116 } catch (BDDMockitoTest.SomethingWasWrong expected) {117 }118 }119 @Test120 @SuppressWarnings("unchecked")121 public void should_stub_void_with_exception_classes() throws Exception {122 BDDMockito.willThrow(BDDMockitoTest.SomethingWasWrong.class, BDDMockitoTest.AnotherThingWasWrong.class).given(mock).voidMethod();123 try {124 mock.voidMethod();125 Assert.fail();126 } catch (BDDMockitoTest.SomethingWasWrong expected) {127 }128 }129 @Test130 public void should_stub_void_consecutively() throws Exception {131 BDDMockito.willDoNothing().willThrow(new BDDMockitoTest.SomethingWasWrong()).given(mock).voidMethod();132 mock.voidMethod();133 try {134 mock.voidMethod();135 Assert.fail();136 } catch (BDDMockitoTest.SomethingWasWrong expected) {137 }138 }139 @Test140 public void should_stub_void_consecutively_with_exception_class() throws Exception {141 BDDMockito.willDoNothing().willThrow(BDDMockitoTest.SomethingWasWrong.class).given(mock).voidMethod();142 mock.voidMethod();143 try {144 mock.voidMethod();145 Assert.fail();146 } catch (BDDMockitoTest.SomethingWasWrong expected) {147 }148 }149 @Test150 public void should_stub_using_do_return_style() throws Exception {151 BDDMockito.willReturn("foo").given(mock).simpleMethod("bar");152 Assertions.assertThat(mock.simpleMethod("boooo")).isEqualTo(null);153 Assertions.assertThat(mock.simpleMethod("bar")).isEqualTo("foo");154 }155 @Test156 public void should_stub_using_do_answer_style() throws Exception {157 BDDMockito.willAnswer(new Answer<String>() {158 public String answer(InvocationOnMock invocation) throws Throwable {159 return invocation.getArgument(0);160 }161 }).given(mock).simpleMethod(ArgumentMatchers.anyString());162 Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");163 }164 @Test165 public void should_stub_by_delegating_to_real_method() throws Exception {166 // given167 BDDMockitoTest.Dog dog = Mockito.mock(BDDMockitoTest.Dog.class);168 // when169 BDDMockito.willCallRealMethod().given(dog).bark();170 // then171 Assertions.assertThat(dog.bark()).isEqualTo("woof");172 }173 @Test174 public void should_stub_by_delegating_to_real_method_using_typical_stubbing_syntax() throws Exception {175 // given176 BDDMockitoTest.Dog dog = Mockito.mock(BDDMockitoTest.Dog.class);177 // when178 BDDMockito.given(dog.bark()).willCallRealMethod();179 // then180 Assertions.assertThat(dog.bark()).isEqualTo("woof");181 }182 @Test183 public void should_all_stubbed_mock_reference_access() throws Exception {184 Set<?> expectedMock = Mockito.mock(Set.class);185 Set<?> returnedMock = BDDMockito.given(expectedMock.isEmpty()).willReturn(false).getMock();186 Assertions.assertThat(returnedMock).isEqualTo(expectedMock);187 }188 @Test(expected = NotAMockException.class)...
Mocking Logger and LoggerFactory with PowerMock and Mockito
PowerMock access private members
Mockito with Java async->sync converter
How to mock void methods with Mockito
Mockito - when thenReturn
Mockito - 0 Matchers Expected, 1 Recorded (InvalidUseOfMatchersException)
What is the difference between mocking and spying when using Mockito?
reason: no instance(s) of type variable(s) T exist so that void conforms to using mockito
Maven: compiling and testing on different source levels
Mockito isA(Class<T> clazz) How to resolve type safety?
EDIT 2020-09-21: Since 3.4.0, Mockito supports mocking static methods, API is still incubating and is likely to change, in particular around stubbing and verification. It requires the mockito-inline
artifact. And you don't need to prepare the test or use any specific runner. All you need to do is :
@Test
public void name() {
try (MockedStatic<LoggerFactory> integerMock = mockStatic(LoggerFactory.class)) {
final Logger logger = mock(Logger.class);
integerMock.when(() -> LoggerFactory.getLogger(any(Class.class))).thenReturn(logger);
new Controller().log();
verify(logger).warn(any());
}
}
The two inportant aspect in this code, is that you need to scope when the static mock applies, i.e. within this try block. And you need to call the stubbing and verification api from the MockedStatic
object.
@Mick, try to prepare the owner of the static field too, eg :
@PrepareForTest({GoodbyeController.class, LoggerFactory.class})
EDIT1 : I just crafted a small example. First the controller :
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Controller {
Logger logger = LoggerFactory.getLogger(Controller.class);
public void log() { logger.warn("yup"); }
}
Then the test :
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Controller.class, LoggerFactory.class})
public class ControllerTest {
@Test
public void name() throws Exception {
mockStatic(LoggerFactory.class);
Logger logger = mock(Logger.class);
when(LoggerFactory.getLogger(any(Class.class))).thenReturn(logger);
new Controller().log();
verify(logger).warn(anyString());
}
}
Note the imports ! Noteworthy libs in the classpath : Mockito, PowerMock, JUnit, logback-core, logback-clasic, slf4j
EDIT2 : As it seems to be a popular question, I'd like to point out that if these log messages are that important and require to be tested, i.e. they are feature / business part of the system then introducing a real dependency that make clear theses logs are features would be a so much better in the whole system design, instead of relying on static code of a standard and technical classes of a logger.
For this matter I would recommend to craft something like= a Reporter
class with methods such as reportIncorrectUseOfYAndZForActionX
or reportProgressStartedForActionX
. This would have the benefit of making the feature visible for anyone reading the code. But it will also help to achieve tests, change the implementations details of this particular feature.
Hence you wouldn't need static mocking tools like PowerMock. In my opinion static code can be fine, but as soon as the test demands to verify or to mock static behavior it is necessary to refactor and introduce clear dependencies.
Check out the latest blogs from LambdaTest on this topic:
The web paradigm has changed considerably over the last few years. Web 2.0, a term coined way back in 1999, was one of the pivotal moments in the history of the Internet. UGC (User Generated Content), ease of use, and interoperability for the end-users were the key pillars of Web 2.0. Consumers who were only consuming content up till now started creating different forms of content (e.g., text, audio, video, etc.).
Were you able to work upon your resolutions for 2019? I may sound comical here but my 2019 resolution being a web developer was to take a leap into web testing in my free time. Why? So I could understand the release cycles from a tester’s perspective. I wanted to wear their shoes and see the SDLC from their eyes. I also thought that it would help me groom myself better as an all-round IT professional.
Did you know that according to Statista, the number of smartphone users will reach 18.22 billion by 2025? Let’s face it, digital transformation is skyrocketing and will continue to do so. This swamps the mobile app development market with various options and gives rise to the need for the best mobile app testing tools
In today’s tech world, where speed is the key to modern software development, we should aim to get quick feedback on the impact of any change, and that is where CI/CD comes in place.
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!