5. /38@yegor256 5
Unit testing anti-patterns:
Happy Path Tests
Validation and Boundary
Easy Tests
The Giant
The Cuckoo
The Conjoined Twins
The Slow Poke
Anal Probe
Test It All
Line Hitter
Wait and See
The Silent Catcher
Chain Gang
The Mockery
The Free Ride
The Local Hero
Wet Floor
The Flickering Test
The Environmental Vandal
Second Class Citizens
The Secret Catcher
Logic in Tests
Code Matching
Misleading Tests
Not Asserting
Asserting on Not-Null
Forty Foot Pole
Test With No Name
Excessive Setup
The Dead Tree
The Turing Test
The Mother Hen
The Sleeper
The Butterfly
Doppelgänger
The Inspector
Structured Inspection
The Cupcake
7. /38@yegor256 7
class Book {
private int id;
String title() {
return Database.getInstance().fetch(
“SELECT title FROM book WHERE id=?”,
this.id
);
}
} String title = new Book().title();
9. /38@yegor256 9
class Book {
private int id;
String title() {
return DbUtils.fetch(
“SELECT title FROM book WHERE id=?”,
this.id
);
}
}
static
Johan Haleby
10. /38@yegor256 10
class Book {
private int id;
String title() {
return Database.getInstance().fetch(
“SELECT title FROM book WHERE id=?”,
this.id
);
}
}
global
11. /38@yegor256 11
class DbUtils {
private static int port;
static String fetch(String sql) {
// ..
}
}
class Database {
private static Database INSTANCE;
private int port;
private Database() {}
static Database getInstance() {
if (Database.INSTANCE == null) {
Database.INSTANCE = new Database();
}
return Database.INSTANCE;
}
String fetch(String sql) {
// ..
}
}
18. /38@yegor256 18
static import org.mockito.Mockito.*;
class BookTest {
@Test
public canFetchTitleFromDatabase() {
Database db = mock(Database.class);
doReturn(“UML Distilled”).when(db).fetch(
“SELECT title FROM book WHERE id=?”, 123
);
Book book = new Book(db, 123);
assert book.title().equals(“UML Distilled”);
}
}
22. /38@yegor256 22
static import org.mockito.Mockito.*;
class BookTest {
@Test
public canFetchTitleFromDatabase() {
Database db = mock(Database.class);
doReturn(“UML Distilled”).when(db).fetch(
“SELECT title FROM book WHERE id=?”, 123
);
Book book = new Book(db, 123);
assert book.title().equals(“UML Distilled”);
}
}
class Book {
private int id;
private Database database;
Book(Database db, int i) {
this.database = db;
this.id = i;
}
String title() {
return this.database.fetch(
“SELECT title FROM book WHERE id=?”,
this.id
);
}
}
25. /38@yegor256 25
class BookTest {
@Test
public canFetchTitleFromDatabase() {
Book book = new Book(
new FakeDatabase(), 123
);
assert book.title().equals(“UML Distilled”);
}
}
class Book {
private int id;
private Database database;
Book(Database db, int i) {
this.database = db;
this.id = i;
}
String title() {
return this.database.fetch(
“SELECT title FROM book WHERE id=?”,
this.id
);
}
}
26. /38@yegor256 26
class BookTest {
@Test
public canFetchTitleFromDatabase() {
Book book = new Book(
new FakeDatabase()
.withTitle(123, “UML Distilled”)
.withTitle(1, “Elegant Objects”)
.withUser(“Peter Pan”),
123
);
assert book.title().equals(“UML Distilled”);
}
}
30. /38@yegor256 30
class BookTest {
@Test
public canBuildURL() {
Book book = new Book();
book.setLanguage(Locale.RUSSIAN);
book.setEncoding(“UTF-8”);
book.setTitle(“Дон Кихот”);
assert book.getURL().contains(“%D0%94%”);
}
}
procedural!