After using Project Lombok, we can find out it help use reduce our boilerplate code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package albert.practice.lambda; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import com.google.common.base.Strings; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; public class LambdaTest { public List<Person> filterData() { List<Person> people = createData(); return people.stream().filter(p -> p.age >= 35).filter(p -> !Strings.isNullOrEmpty(p.email)) .collect(Collectors.toList()); } public List<Person> filterDataWithSort() { List<Person> people = createData(); return people.stream().filter(p -> p.age >= 35).sorted((p1, p2) -> (p1.age - p2.age)) .sorted((p1, p2) -> p2.name.compareTo(p1.name)).collect(Collectors.toList()); } public List<Person> createData() { Person ben = new Person("Ben Whittaker", 70, "ben@gmail.com"); Person jules = new Person("Jules Ostin", 30, "jules@gmail.com"); Person fiona = new Person("Fiona Farwell", 68, null); Person matt = new Person("Matt", 35, "matt@gmail.com"); return Arrays.asList(ben, jules, fiona, matt); } @Data @ToString @AllArgsConstructor @NoArgsConstructor public static class Person { private String name; private int age; private String email; } } |
But you will also notice your code coverage rate is down dramatically.
How to improve the code coverage rate?
How-To
Add two dependencies to your pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <dependencies> <dependency> <groupId>org.meanbean</groupId> <artifactId>meanbean</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>nl.jqno.equalsverifier</groupId> <artifactId>equalsverifier</artifactId> <version>2.2.1</version> <scope>test</scope> </dependency> </dependencies> |
Check the testPersonBean() and testEqualsAndHashCode() in this test case:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package albert.practice.lambda; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.Before; import org.junit.Test; import org.meanbean.test.BeanTester; import albert.practice.lambda.LambdaTest.Person; import lombok.extern.slf4j.Slf4j; import nl.jqno.equalsverifier.EqualsVerifier; import nl.jqno.equalsverifier.Warning; @Slf4j public class LambdaUnitTest { private LambdaTest lambdaTest = null; @Before public void setup() { lambdaTest = new LambdaTest(); } @Test public void testCreateData() { List<Person> people = lambdaTest.createData(); assertEquals(people.size(), 4); } @Test public void testFilterData() { List<Person> people = lambdaTest.filterData(); log.debug("testFilterData = " + people.toString()); assertEquals(people.size(), 2); } @Test public void testFilterDataWithSort() { List<Person> people = lambdaTest.filterDataWithSort(); log.debug("testFilterDataWithSort = " + people.toString()); assertEquals(people.size(), 3); } // Testing getter and setters methods @Test public void testPersonBean() { new BeanTester().testBean(LambdaTest.Person.class); } // Testing equals() and hashCode() @Test public void testEqualsAndHashcode() { EqualsVerifier.forClass(LambdaTest.Person.class) .suppress(Warning.STRICT_INHERITANCE, Warning.NONFINAL_FIELDS).verify(); } } |
After running code coverage analysis, you can find out this problem had been solved:
Reference
[1] http://www.jdev.it/tips-unit-testing-javabeans/