Объясните как в java работают TDD тесты на примере данного класса?

Из того что я понимаю на данный момент, вначале пишем тесты которые задают грубо говоря нашу будущую логику программы, дальше пишем саму логику... если логика удовлетворяет нашим тестам то видим что тест прошел.. и идем дальше.

Имя класса и методов в которые будут производить тестирование моего класса не могут быть произвольными?
В какой момент именно будут вызываться данные тесты?
После компиляции моего кода, вызов тестов будет происходить каждый раз при запуске программы?
Использую Intellij Community, мне требуется устанавливать дополнительные плагины или есть уже по дефолту что то?

Буду рад если кто то объяснит максимально простыми словами.

@Entity
@JsonInclude(value = Include.NON_EMPTY)
public class Post extends AuditableEntry {

	private String title;

	@OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<Comment> comments;

	public Post() {

	}

	public Post(UUID id) {
		super(id);
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		Assert.hasText(title, "title cannot be null/empty/blank");
		this.title = title;
	}

	public List<Comment> getComments() {
		return comments;
	}

	@Override
	public int hashCode() {
		return super.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		return super.equals(obj);
	}

}


И собственно сами тесты:
public class PostTest {

	@Test
	public void shouldReturnItsValues() {
		UUID id = UUID.randomUUID();
		Post post = new Post(id);
		LocalDateTime createdAt = LocalDateTime.of(2018, 11, 22, 9, 30, 59);
		LocalDateTime updatedAt = LocalDateTime.of(2018, 11, 23, 10, 50, 01);
		post.setTitle("New post");		
		post.setContent("Bla bla");
		post.setCreatedAt(createdAt);
		post.setUpdatedAt(updatedAt);
		
		assertThat(post.getId()).isEqualTo(id);
		assertThat(post.getTitle()).isEqualTo("New post");
		assertThat(post.getContent()).isEqualTo("Bla bla");
		assertThat(post.getCreatedAt()).isEqualTo(createdAt);
		assertThat(post.getUpdatedAt()).isEqualTo(updatedAt);		
	}
	
	@Test()
	public void shouldNotAcceptNullEmptyNorBlankTitle() {
		Post post = new Post();
		Assertions.assertThatThrownBy(() -> post.setTitle(null)).isInstanceOf(IllegalArgumentException.class);
		Assertions.assertThatThrownBy(() -> post.setTitle("")).isInstanceOf(IllegalArgumentException.class);
		Assertions.assertThatThrownBy(() -> post.setTitle(" ")).isInstanceOf(IllegalArgumentException.class);
	}

	@Test()
	public void shouldNotAcceptNullEmptyNorBlankContent() {
		Post post = new Post();
		Assertions.assertThatThrownBy(() -> post.setContent(null)).isInstanceOf(IllegalArgumentException.class);
		Assertions.assertThatThrownBy(() -> post.setContent("")).isInstanceOf(IllegalArgumentException.class);
		Assertions.assertThatThrownBy(() -> post.setContent(" ")).isInstanceOf(IllegalArgumentException.class);
	}
	
	@Test
	public void shouldHonorBasicHashcodeContract() {
		UUID id = UUID.randomUUID();
		Post post = newPost(id);
		// Post has consistent hashcode
		assertThat(post.hashCode()).isEqualTo(post.hashCode());
		// 2 equal Post have same hashcode
		assertThat(newPost(id).hashCode()).isEqualTo(newPost(id).hashCode());
	}
	@Test
	public void shouldHonorBasicEqualsContract() {
		Post post = newPost();
		// equals to self
		assertThat(post.equals(post)).isTrue();
		// not equals to null
		assertThat(post.equals(null)).isFalse();
		// not equals to an instance of another class
		assertThat(post.equals(new Object())).isFalse();
	}

	@Test
	public void shouldBeEqualToAnotherPostWithSameNonNullID() {
		UUID id = UUID.randomUUID();
		UUID id2 = UUID.randomUUID();
		while (id2.equals(id))
			id2 = UUID.randomUUID();
		
		// 2 Post with null id are not equal
		assertThat(newPost().equals(newPost())).isFalse();
		// 2 Post with same id are equal
		assertThat(newPost(id).equals(newPost(id))).isTrue();
		// 2 Post with different id not are equal
		assertThat(newPost(id).equals(newPost(id2))).isFalse();
	}


	private Post newPost() {
		return new Post() {
		};
	}

	private Post newPost(UUID id) {
		return new Post(id) {
		};
	}

}
  • Вопрос задан
  • 937 просмотров
Пригласить эксперта
Ответы на вопрос 1
jaxtr
@jaxtr
JavaEE/Spring-разработчик
Из того что я понимаю на данный момент, вначале пишем тесты которые задают грубо говоря нашу будущую логику программы, дальше пишем саму логику... если логика удовлетворяет нашим тестам то видим что тест прошел.. и идем дальше.


Да, всё верно понимаешь.

Имя класса и методов в которые будут производить тестирование моего класса не могут быть произвольными?


Как угодно, но обычно класс с тестами аналогичен тестируемому классу, но с суффиксом Test. Например: есть класс GreetingService, то тестовый класс будет GreetingServiceTest

В какой момент именно будут вызываться данные тесты?


При сборке проекта при помощи инструментов сборки вроде Ant, Maven или Gradle.

После компиляции моего кода, вызов тестов будет происходить каждый раз при запуске программы?


Тесты исполняются только при сборке проекта.

Использую Intellij Community, мне требуется устанавливать дополнительные плагины или есть уже по дефолту что то?


Для поддержки JUnit или TestNG потребуются соответствующие плагины.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы