“why are you even here?”

I went to part of the Toastmasters conference last week. At one of the sessions, I was on my tablet and the lady next to me said “why are you even here if you aren’t going to pay attention”. I was doing a mix of:

I obviously didn’t get into this with the woman who said this. But I did email myself that the answer would be a good blog post. I use a computer/tablet during conferences in two scenarios.

Scenario 1: I want to be fully immersed in the material

As noted in the presentation she was hassling me in, humans have a short attention span. Live blogging prevents me from being distracted. I’m *very* focused on what is going on because I’m listening and processing to write. This only leaves me with a tiny bit of spare brain power. Which I use for scanning comments from others ex: twitter.  And it prevents me from having enough brain power to attempt doing something that has the potential to steal my focus like email.

Now granted, I wasn’t live blogging at the Toastmasters conference. But it is common for me to do so at tech conferences. For example, see my QCon blog posts. Hard to argue I wasn’t paying attention there!

Scenario 2: Only listening some

Sometimes you are only interested in part of a session or the speaker isn’t great. Not bad enough to get up and leave. But not enough to want to pay full attention. (If I’m at a session after work on the weekend or on a vacation day, it’s completely up to me how much attention I pay.) And there’s an advantage to this. Paying partial attention, you might learn something. Leaving you guarantee you’ll learn nothing.

This Toastmasters event was on my vacation time and I paid the entrance fee. There were plenty of the empty chairs in the room so I wasn’t taking a seat away from someone who would pay full attention. And I didn’t sit in the front so I wasn’t taking up a “good seat”. So completely up to me what I wanted to do in the room. At least I wasn’t bothering anyone. I sat next to another person at this event (not this lady) who took notes by repeating what the speaker said into their phone.

As far as why did I come – I wanted to see what the semifinals and world championships of public speaking were like. And I wanted to go on vacation to Vancouver. So I combined the two. You can’t pay for just the speaking part; the educational sessions are bundled. So I went to most of them. They were good. But mainly inspirational or facts we’ve been exposed to. I don’t need to pay full attention to get what I’m going to out of that.

Conferences encourage this

The Toastmasters conference encouraged people to post in the activity stream of their app. (Like a poor man’s twitter.) They incentivized posting pictures rather than having discussions so the stream wasn’t comment rich. But they clearly didn’t discourage having your phone/tablet out. And they supplied internet. [By comparison there was a no phone/tablet policy during the world championships of public speaking at night.]

Now for the speaker’s side

My first public presentation was in 2011 at The Java Server Side Symposium. (Scott and I live blogged there too). I knew it is common at tech conferences for people to be doing other things while in a session – tweeting, email, coding, whatever. So I gave a presentation at my Toastmasters club called “The Case of the Distracted Audience”. I gave people specific annoying things to do and practiced reacting to them. It helped a lot.

 

 

junit 5 and intellij

I use Eclipse at home for development. And mostly Maven (except for two projects that use Ant because some of the people working on them have less reliable internet connections).

After preparing to run JUnit 5 with Eclipse and Maven, I wanted to check the impact on IntelliJ. It’s been a long time since I’ve tried using IntelliJ. The internet says it supports JUnit 5 so I wanted to try it to confirm. I need to know this:

  1. So I know what IDEs people can use at my JavaOne JUnit 5 hands on lab
  2. So I know whether upgrading the CodeRanch JForum fork to JUnit 5 will be a problem for the developers using IntelliJ

Installing IntelliJ

  1. Download Mac version of free community edition from JetBrains
  2. Drag .dmg folder to Applications folder
  3. I chose not import settings. I don’t even remember the last time I ran IntelliJ on my Mac so those settings aren’t likely to be useful.
  4. After accepting the privacy policy, IntelliJ opens and I chose all the defaults.

Running the project

To run the project I migrated, I chose:

  • Check out from version control > git
  • https://github.com/boyarsky/oracle-java-cert-objectives-history.git and clone
  • IntelliJ asked if wanted to create a project based on the pom and I said yes
  • Choose command 1 for project view
  • Tried to open a Java class and got prompted to configure the SDK. I chose the latest Java 8 on my machine. No need to use Java 9 for what I’m doing. /Library/Java/JavaVirtualMachines/jdk1.8.0_xxx.jdk/Contents/Home
  • Build using build pulldown
  • Run using run pulldown

The result

IntelliJ was able to recognize the JUnit 5 annotations/methods and run them. It’s a bit ahead of Eclipse in this space so JUnit 5 won’t be a problem if they are using the latest version of IntelliJ.

upgrading to junit 5 parameterized tests for the first time

I’ve been playing with JUnit 5 for a while. Migrating existing project is something else so I decided to try with my small project cert objectives checker. This project does run on Jenkins so is a good test because it isn’t just on my machine. First I set up Eclipse and Maven to work with JUnit 5.

Switch to Jupiter APIs

Since I only had 5 classes, I updated by hand. For each class:

  1. Changed imports to
    import static org.junit.jupiter.api.Assertions.*;
    import static org.hamcrest.MatcherAssert.assertThat;
    import org.junit.jupiter.api.*;

    (The hamcrest one is so I can keep using assertThat)

  2. Changed assertEquals/assertTrue/etc calls to have String message as last parameter instead of first.
  3. Changed @Before to @BeforeEach
  4. Got distracted and updated tests to Java 8 syntax (nothing to do with JUnit)
  5. Changed to use new ParameterizedTest syntax. More on this…

Parameterized tests

Interestingly Eclipse knows about the new Parameterized Tests dependency natively. But if you use Maven, you need to add a dependency:

<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-params</artifactId>
  <version>5.0.0-RC2</version>
</dependency>

Now let’s compare the before and after. I’ve omitted parts that are the same in both (aka the detailed logic of my test). Not that it is secret of anything. (After all the project is public on github.) But it makes it easier to compare the differences with less code.

JUnit 4 version

import static org.junit.Assert.*;

import java.io.*;
import java.net.*;
import java.nio.file.*;
import java.util.*;

import javax.xml.parsers.*;

import org.junit.*;
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Parameterized.Parameters;
import org.w3c.dom.*;

@RunWith(Parameterized.class)
public class CheckForChangesIT {

  @Parameters
  public static List<CertsToCheckEnum[]> suite() {
    List<CertsToCheckEnum[]> result = new ArrayList<>();
    for (CertsToCheckEnum element : CertsToCheckEnum.values()) {
       result.add(new CertsToCheckEnum[] { element });
    }
    return result;
  }
  // ----------------------------------------------------
  private CertsToCheckEnum certToCheck;
  private InputStream stream;
  private Document doc;

  public CheckForChangesIT(CertsToCheckEnum certToCheck) {
    this.certToCheck = certToCheck;
  }
  // ----------------------------------------------------
  @Before
  public void connect() throws Exception {
    String url = XML_URL + certToCheck.getExamNumber();
    stream = new URL(url).openStream();
  }
  @After
  public void close() {
    if (stream != null) {
      try {
        stream.close();
      } catch (Exception e) {
        // ignore
      }
    }
  }
  // ----------------------------------------------------
  @Test
  public void upToDate() throws Exception {
    parseDocument();
    String currentData = convertToString();
    assertSameAsExisting(currentData);
  }

JUnit 5 version

import static org.junit.jupiter.api.Assertions.*;

import java.io.*;
import java.net.*;
import java.nio.file.*;

import javax.xml.parsers.*;

import org.junit.jupiter.params.*;
import org.junit.jupiter.params.provider.*;
import org.w3c.dom.*;

public class CheckForChangesIT {

  private CertsToCheckEnum certToCheck;
  private Document doc;
  // ----------------------------------------------------
  @ParameterizedTest
  @EnumSource(CertsToCheckEnum.class)
  public void upToDate(CertsToCheckEnum c) throws Exception {
    certToCheck = c;
    String url = XML_URL + certToCheck.getExamNumber();
    try (InputStream stream = new URL(url).openStream()) {
      parseDocument(stream);
      String currentData = convertToString();
      assertSameAsExisting(currentData);
    }
  }

Key differences between JUnit 4 and 5 Parameterized Test

  • The JUnit 5 annotation has a different name and is placed on the test rather than the class. This is good because it lets you have some parameterized tests in a class and some regular tests. With JUnit 4, I had to arbitrarily create another class for the non-parameterized parts.
  • JUnit 5 has a number of annotations for building the parameter list without having to write custom code.
  • JUnit 5 injects the parameter as a method parameter rather than an instance variable.
    • In many ways this is nice. For example, I am now using a try-with-resources to close the stream rather than creating in @BeforeEach and having ugly logic to clean it up later. I could have done this in JUnit 4 but it seemed less natural.
    • In the case of my “legacy” test, I use the previously injected instance variable all over the class.  Hence my hack of storing the local variable in the original instance variable as the first line of my test method.
  • The JUnit 5 version is a good bit shorter

One problem

I encountered a minor Eclipse bug with parameterized tests. So I reported it.