unit test for Semaphore

I'm not completely sure about this test. It contains multiple flows.

The first part of the run method you acquire and licenses even though there are enough. But you can do this in a method that doesn't rely on a thread and I think it already has been tested in another method.

testAcquire_whenEnoughPermits e.g.

So I would remove that from this test.

The second part of the run method is interesting because you are trying to acquire too many licenses and therefor your thread is going to block (which is good).

What I would do is:
get rid of the join; it isn't going to complete anyway within 3 seconds.. because your thread is blocked. 

I would do an 
assertTrueEventually(assertTrue(semaphore.availablePermits(),0))
thread.assertIsAlive()

See my comments below about pulling out a powerful testthread with all kinds of useful asserts.