Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java libraries you can't afford to miss

10,353 views

Published on

DevoxxPL 2016

Published in: Technology

Java libraries you can't afford to miss

  1. 1. @aalmiray #DevoxxPL JAVA LIBRARIES YOU CAN’T AFFORD TO MISS ANDRES ALMIRAY @AALMIRAY
  2. 2. @aalmiray #DevoxxPL
  3. 3. @aalmiray #DevoxxPL DEPENDENCY INJECTION
  4. 4. @aalmiray #DevoxxPL Guice - https://github.com/google/guice Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(Engine.class).annotatedWith(named("efficient")) .to(FusionPoweredEngine.class) bind(Engine.class).annotatedWith(named("poor")) .to(CoalPoweredEngine.class) } }); Key key = Key.of(Engine.class, named("poor")); Engine engine = injector.getInstance(key); // do something with engine  
  5. 5. @aalmiray #DevoxxPL Spring - http://projects.spring.io/spring-framework/ •  More than just dependency injection •  Assertions •  MessageSource + MessageFormat •  Serialization •  JDBC, JPA •  JMX •  Validation •  Scheduling •  Testing
  6. 6. @aalmiray #DevoxxPL BEHAVIOR
  7. 7. @aalmiray #DevoxxPL SLF4J - http://www.slf4j.org/ •  Wraps all other logging frameworks: •  java.util.logging •  Apache commons logging •  Log4j •  Provides varargs methods
  8. 8. @aalmiray #DevoxxPL Guava - https://github.com/google/guava •  New Collections: •  MultiSet •  BiMap •  MultiMap •  Table •  Utility classes for Collections •  Utility classes for String •  Caches •  Reflection •  I/O •  Functional programming support (JDK6+)
  9. 9. @aalmiray #DevoxxPL OkHttp - http://square.github.io/okhttp/ public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); return response.body().string(); }
  10. 10. @aalmiray #DevoxxPL RxJava - http://reactivex.io/ Observable<Repository> observable = github.repositories(model.getOrganization()); if (model.getLimit() > 0) { observable = observable.take(model.getLimit()); } Subscription subscription = observable .timeout(10, TimeUnit.SECONDS) .doOnSubscribe(() -> model.setState(RUNNING)) .doOnTerminate(() -> model.setState(READY)) .subscribeOn(Schedulers.io()) .subscribe( model.getRepositories()::add, Throwable::printStackTrace); model.setSubscription(subscription);
  11. 11. @aalmiray #DevoxxPL Retrofit - http://square.github.io/retrofit/ public interface GithubAPI { @GET("/orgs/{name}/repos") Call<List<Repository>> repositories(@Path("name") String name); @GET Call<List<Repository>>> repositoriesPaginate(@Url String url); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .addConverterFactory(JacksonConverterFactory.create(objectMapper)) .build(); return retrofit.create(GithubAPI.class);
  12. 12. @aalmiray #DevoxxPL Retrofit + RxJava public interface GithubAPI { @GET("/orgs/{name}/repos") Observable<Response<List<Repository>>> repositories(@Path("name") String name); @GET Observable<Response<List<Repository>>> repositoriesPaginate(@Url String url); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .addConverterFactory(JacksonConverterFactory.create(objectMapper)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return retrofit.create(GithubAPI.class);
  13. 13. @aalmiray #DevoxxPL JDeferred - http://jdeferred.org/ model.setState(RUNNING); int limit = model.getLimit(); limit = limit > 0 ? limit : Integer.MAX_VALUE; Promise<Collection<Repository>, Throwable, Repository> promise = github.repositories(model.getOrganization(), limit); promise.progress(model.getRepositories()::add) .fail(Throwable::printStackTrace) .always((state, resolved, rejected) -> model.setState(READY));
  14. 14. @aalmiray #DevoxxPL MBassador - https://github.com/bennidi/mbassador public class EventHandler { private static final Logger LOG = LoggerFactory.getLogger(EventHandler.class); @Inject private net.engio.mbassy.bus.MBassador<ApplicationEvent> eventBus; @net.engio.mbassy.listener.Handler public void handleNewInstance(NewInstanceEvent event) { LOG.trace("New instance created {}", event.getInstance()); } public void createInstance() { eventBus.publish(new NewInstanceEvent(Person.builder() .name("Andres") .lastname("Almiray") .build())); } }
  15. 15. @aalmiray #DevoxxPL BYTECODE/ AST
  16. 16. @aalmiray #DevoxxPL Lombok - https://projectlombok.org/ import javax.annotation.Nonnull; @lombok.Data public class Person { private final String name; private final String lastname; @Nonnull @lombok.Builder public static Person create(@Nonnull String name, @Nonnull String lastname) { return new Person(name, lastname); } } @lombok.Data @lombok.EqualsAndHashCode(callSuper = true) @lombok.ToString(callSuper = true) public class NewInstanceEvent extends ApplicationEvent { @javax.annotation.Nonnull private final Object instance; }
  17. 17. @aalmiray #DevoxxPL ByteBuddy - http://bytebuddy.net public class Foo { public String bar() { return null; } public String foo() { return null; } public String foo(Object o) { return null; } } Foo dynamicFoo = new ByteBuddy() .subclass(Foo.class) .method(isDeclaredBy(Foo.class)).intercept(FixedValue.value("One!")) .method(named("foo")).intercept(FixedValue.value("Two!")) .method(named("foo").and(takesArguments(1))) .intercept(FixedValue.value("Three!")) .make() .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) .getLoaded() .newInstance();
  18. 18. @aalmiray #DevoxxPL TESTING
  19. 19. @aalmiray #DevoxxPL JUnitParams - https://github.com/Pragmatists/JUnitParams @RunWith(JUnitParamsRunner.class) @TestFor(SampleService.class) public class SampleServiceTest { private SampleService service; @Rule public final GriffonUnitRule griffon = new GriffonUnitRule(); @Test @Parameters({",Howdy stranger!", "Test, Hello Test"}) public void sayHello(String input, String output) { assertThat(service.sayHello(input), equalTo(output)); } }  
  20. 20. @aalmiray #DevoxxPL Mockito - http://mockito.org/ @Test @Parameters({",Howdy stranger!", "Test, Hello Test"}) public void sayHelloAction(String input, String output) { // given: SampleController controller = new SampleController(); controller.setModel(new SampleModel()); controller.setService(mock(SampleService.class)); // expectations when(controller.getService().sayHello(input)).thenReturn(output); // when: controller.getModel().setInput(input); controller.sayHello(); // then: assertThat(controller.getModel().getOutput(), equalTo(output)); verify(controller.getService(), only()).sayHello(input); }  
  21. 21. @aalmiray #DevoxxPL Jukito - https://github.com/ArcBees/Jukito @RunWith(JukitoRunner.class) public class SampleControllerJukitoTest { @Inject private SampleController controller; @Before public void setupMocks(SampleService sampleService) { when(sampleService.sayHello("Test")).thenReturn("Hello Test"); } @Test public void sayHelloAction() { controller.setModel(new SampleModel()); controller.getModel().setInput("Test"); controller.sayHello(); assertThat(controller.getModel().getOutput(), equalTo("Hello Test")); verify(controller.getService(), only()).sayHello("Test"); } }  
  22. 22. @aalmiray #DevoxxPL Spock- http://spockframework.org/ @spock.lang.Unroll class SampleControllerSpec extends spock.lang.Specification { def "Invoke say hello with #input results in #output"() { given: SampleController controller = new SampleController() controller.model = new SampleModel() controller.service = Mock(SampleService) { sayHello(input) >> output } when: controller.model.input = input controller.sayHello() then: controller.model.output == output where: input << ['', 'Test'] output << ['Howdy, stranger!', 'Hello Test'] } }  
  23. 23. @aalmiray #DevoxxPL Awaitility - https://github.com/awaitility/awaitility @Test @Parameters({",Howdy stranger!”, "Test, Hello Test"}) public void sayHelloAction(String input, String output) { // given: SampleModel model = mvcGroupManager.findModel("sample", SampleModel.class); SampleController controller = mvcGroupManager.findController("sample", SampleController.class); // expect: assertThat(model.getOutput(), nullValue()); // when: model.setInput(input); controller.invokeAction("sayHello"); // then: await().until(() -> model.getOutput(), notNullValue()); assertThat(model.getOutput(), equalTo(output)); }  
  24. 24. @aalmiray #DevoxxPL Rest-assured - https://github.com/rest-assured/rest-assured get("/lotto").then().assertThat().body("lotto.lottoId",  equalTo(5));     given().          param("key1",  "value1").          param("key2",  "value2").   when().          post("/somewhere").   then().          body(containsString("OK"));       * Includes JsonPath and XmlPath support
  25. 25. @aalmiray #DevoxxPL HONORARY MENTIONS
  26. 26. @aalmiray #DevoxxPL Okio - https://github.com/square/okio HikariCP - https://github.com/brettwooldridge/HikariCP gRPC - http://www.grpc.io/ Kryo - https://github.com/EsotericSoftware/kryo MockServer - http://www.mock-server.com/
  27. 27. @aalmiray #DevoxxPL THANK YOU! ANDRES ALMIRAY @AALMIRAY

×