Юнни Тест 
и все-все-все
Юра 
Литвиненко 
•Джавист, скалист и тд 
•http://linkd.in/lytvynenko 
•@surg
Мне нравится
Мне нравится
Мне нравится 
• Dependency 
Injection
Мне нравится 
• Dependency 
Injection 
• DSL
Dependency Injection
DI 
interface 
Lorem 
{ 
int 
ipsum();}
DI 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
}
DI 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
private 
Lorem 
lorem; 
}
DI 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
private 
Lorem 
lorem; 
public 
void 
sit() 
{ 
lorem.ipsum(); 
} 
}
DI 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit() 
{ 
lorem.ipsum(); 
} 
}
DSL
DSL
DSL 
Notification 
notification
DSL 
Notification 
notification 
= 
new 
Builder()
DSL 
Notification 
notification 
= 
new 
Builder() 
.to(user)
DSL 
Notification 
notification 
= 
new 
Builder() 
.to(user) 
.subject(msgSubject)
DSL 
Notification 
notification 
= 
new 
Builder() 
.to(user) 
.subject(msgSubject) 
.body(msgBody)
DSL 
Notification 
notification 
= 
new 
Builder() 
.to(user) 
.subject(msgSubject) 
.body(msgBody) 
.settings(settings)
DSL 
Notification 
notification 
= 
new 
Builder() 
.to(user) 
.subject(msgSubject) 
.body(msgBody) 
.settings(settings) 
.build();
DSL 
• Читабельно
DSL 
• Читабельно 
• Геттеры
DSL 
• Читабельно 
• Геттеры 
• Сеттеры
Инструменты 
• Guice http://code.google.com/p/google-guice/ 
• TestNG http://testng.org/ 
• Mockito http://mockito.org 
• Fest Asserts http://docs.codehaus.org/display/FEST/ 
Fluent+Assertions+Module
Guice
Guice
Guice 
• Информативные 
сообщения об ошибках
Guice 
• Информативные 
сообщения об ошибках 
• Биндинг в коде
Guice 
• Информативные 
сообщения об ошибках 
• Биндинг в коде 
• RI JSR-330
TestNG
TestNG
TestNG 
• Альтернатива JUnit
TestNG 
• Альтернатива JUnit 
• Группировка тестов
TestNG 
• Альтернатива JUnit 
• Группировка тестов 
• Зависимости тестов
TestNG 
• Альтернатива JUnit 
• Группировка тестов 
• Зависимости тестов 
• Интеграция с Guice!
Mockito
Mockito
Mockito 
• Исчерпывающие 
сообщения об 
ошибках
Mockito 
• Исчерпывающие 
сообщения об 
ошибках 
• DSL
Mockito: Пример 
List 
mocked 
=
Mockito: Пример 
List 
mocked 
= 
Mockito.mock(List.class);
Mockito: Пример 
List 
mocked 
= 
mock(List.class); 
when(mocked.get(0))
Mockito: Пример 
List 
mocked 
= 
mock(List.class); 
when(mocked.get(0)).thenReturn(“first”);
Mockito: Пример 
List 
mocked 
= 
mock(List.class); 
when(mocked.get(0)).thenReturn(“first”); 
verify(mocked).get(0);
Fest Assert
FEST Assert 
• DSL 
• Минимализм
FEST Assert: Пример 
List<String> 
newEmployees 
= 
...;
FEST Assert: Пример 
List<String> 
newEmployees 
= 
...; 
assertThat(newEmployees)
FEST Assert: Пример 
List<String> 
newEmployees 
= 
...; 
assertThat(newEmployees) 
.describedAs(“Employees 
hired 
today”);
FEST Assert: Пример 
List<String> 
newEmployees 
= 
...; 
assertThat(newEmployees) 
.describedAs(“Employees 
hired 
today”) 
.hasSize(6)
FEST Assert: Пример 
List<String> 
newEmployees 
= 
...; 
assertThat(newEmployees) 
.describedAs(“Employees 
hired 
today”) 
.hasSize(6) 
.contains(“frodo”, 
“sam”);
Все вместе
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit() 
{ 
lorem.ipsum(); 
} 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{ 
dummy.setFoo(lorem.ipsum()); 
} 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
class 
DolorTest 
{ 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
@Inject 
private 
Dolor 
dolor; 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
@Inject 
private 
Dolor 
dolor; 
@Test 
public 
void 
testSit() 
{ 
... 
} 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
@Inject 
private 
Dolor 
dolor; 
@Test 
public 
void 
testSit() 
{ 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
@Inject 
private 
Dolor 
dolor; 
@Test 
public 
void 
testSit() 
{ 
Dummy 
dummy 
= 
new 
Dummy(); 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
@Inject 
private 
Dolor 
dolor; 
@Test 
public 
void 
testSit() 
{ 
Dummy 
dummy 
= 
new 
Dummy(); 
dolor.sit(dummy); 
}
Все вместе 
interface 
Lorem 
{ 
int 
ipsum();} 
class 
Dolor 
{ 
@Inject 
private 
Lorem 
lorem; 
public 
void 
sit(Dummy 
dummy) 
{...} 
} 
@Guice(modules=TestUnniModule.class) 
class 
DolorTest 
{ 
@Inject 
private 
Dolor 
dolor; 
@Test 
public 
void 
testSit() 
{ 
Dummy 
dummy 
= 
new 
Dummy(); 
dolor.sit(dummy); 
assertThat(dummy.getFoo).isNotNull(); 
}
Ссылки 
• Проект с примерами со слайдов 
https://github.com/surg/unni-test 
• Guice http://code.google.com/p/google-guice/ 
• TestNG http://testng.org/ 
• Mockito http://mockito.org 
• Fest Asserts http://docs.codehaus.org/display/FEST/ 
Fluent+Assertions+Module
Спасибо! 
@surg

Java/Scala Lab: Юрий Литвиненко - Lightning talk