Testing Tips for Java Developers

Hamcrest
- More Readable.
- Provides Better Failure Messages
Type Safety
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
org.hamcrest.Matchers
containsString, startsWith, endsWith, equalTo,equalToIgnoringCase, equalToIgnoringWhitespace, isEmpty, isEmptyOrNull and stringContainsInOrder

assertThat(actual, containsString(expected));
assertThat(actual, nullValue());
assertThat(actual, notNullValue());

assertThat(subClass, instanceOf(BaseClass.class));

Mockito
-- Don't mock too much, only mock directly dependence
http://googletesting.blogspot.com/2013/05/testing-on-toilet-dont-overuse-mocks.html
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
@Mock
Mockito.mock(XX.class)
@Spy
- used to wrap a real object. Every call, unless specified otherwise, is delegated to the object.
@InjectMocks
@Captor
ArgumentCaptor<XClass> captor=ArgumentCaptor.forClass(XClass.class);
verify(mock).doSomething(capto.capture());
Stubbing
when(mockObj.someMethod(0)).thenReturn("someThing");
when(mockObj.someMethod(1)).thenThrow(new RuntimeException());
when(instance.someMethod()).thenReturn(someValue);
thenThrow(Throwable)
thenCallRealMethod()


Use @Spy or the spy() method to wrap a real object
Important gotcha on spying real objects!
- use doReturn|Answer|Throw() to stub spy object
doReturn("some").when(spyObj).someMethod();

verify(mockObj, never()).someMethod(param);
verifyZeroInteractions(mock...);
verify(mockObj, atLeast(2)).someMethod();
verify(mockObj, times(3)).someMethod();

Invalid use of argument matchers!
When using matchers, all arguments have to be provided by matchers.
//incorrect: someMethod(anyObject(), "raw String"); 
// Should be

someMethod(anyObject(), eq("raw String"));

Testing Servlet
when(request.getParameter("user")).thenReturn("userA");
verify(response).setContentType("plain/text");
verify(response).addHeader("headerA")).thenReturn("value");
Mock chained calles
@Mock(answer = Answers.RETURNS_DEEP_STUBS) SomeService service;

when(service.getX().getY()).thenReturn(Z);

Main Steps
create mock:@Mock -> stubbing:when/thenReturn -> Verify: verify

Do different things when call multiple times
doReturn(null).doReturn(anotherInstance).when(mock).method();

JUnit
@Test(expected=XXException.class)
@Rule
public ExpectedException thrown = ExpectedException.none();
thrown.expect(XyzException.class); // before call the tested method

TestNG
Testing with TestNG

locustio

Spring + JUnit
docs
JUnit 4.11 doesn't work with Spring Test framework.

Using REST Assured to test http APIs
Response rsp = given().filter(sessionFilter).when().get(someUrl).then().statusCode(is(200))).extract().response()
Map importResult = rsp.as(Map[].class)[0];

assertThat(Boolean.valueOf(importResult.get("success").toString()), is(true));

Maven
Run specific method
mvn test -Dtest=className#methodName

Eclipse Tips
Plugins
MoreUnit
Add Static Import Automatically
To help write test cases easier, when we type "assertT" and hit Ctrl+Space, we want Eclipse to add static import automatically for us: import static org.hamcrest.MatcherAssert.assertThat;
Window > Preferences > Java > Editor > Content Assist > Favorites, then add:

org.hamcrest
org.hamcrest.Matchers.*
org.hamcrest.CoreMatchers.*


org.junit.*
org.junit.Assert.*
org.junit.Assume.*
org.junit.matchers.JUnitMatchers.*


org.mockito.Mockito
org.mockito.Matchers
org.mockito.ArgumentMatchers
io.restassured.RestAssured

Run Tests Across Multiple Projects
--Eclipse Tips + Tricks - 2016
https://github.com/takari/takari-cpsuite
Create a maven project depending on all the projects you want to test.
Create Test code:
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.runner.RunWith;
@RunWith(ClasspathSuite.class)
public class TestRunner {
}
Post a Comment

Labels

Java (159) Lucene-Solr (111) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (37) Eclipse (33) Code Example (31) Linux (24) JavaScript (23) Spring (22) Windows (22) Web Development (20) Nutch2 (18) Tools (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) Lesson Learned (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts