Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,30 @@
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<!-- JUnit 4 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>

<!-- Mockito -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.12.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<!-- Java 11 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
Expand All @@ -25,6 +44,29 @@
<target>11</target>
</configuration>
</plugin>

<!-- Jacoco -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>

</plugins>
</build>

Expand Down
12 changes: 6 additions & 6 deletions src/main/java/com/example/Lion.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@

public class Lion {

boolean hasMane;
private final boolean hasMane;
private final Feline feline;

public Lion(String sex) throws Exception {
public Lion(String sex, Feline feline) throws Exception {
if ("Самец".equals(sex)) {
hasMane = true;
} else if ("Самка".equals(sex)) {
hasMane = false;
} else {
throw new Exception("Используйте допустимые значения пола животного - самей или самка");
throw new Exception("Используйте допустимые значения пола животного - самец или самка");
}
this.feline = feline;
}

Feline feline = new Feline();

public int getKittens() {
return feline.getKittens();
}
Expand All @@ -29,4 +29,4 @@ public boolean doesHaveMane() {
public List<String> getFood() throws Exception {
return feline.getFood("Хищник");
}
}
}
37 changes: 37 additions & 0 deletions src/test/java/com/example/AnimalFoodParameterizedTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class AnimalFoodParameterizedTest {

private final String animalKind;
private final List<String> expectedFood;

public AnimalFoodParameterizedTest(String animalKind, List<String> expectedFood) {
this.animalKind = animalKind;
this.expectedFood = expectedFood;
}

@Parameterized.Parameters(name = "{index}: kind={0}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"Травоядное", List.of("Трава", "Различные растения")},
{"Хищник", List.of("Животные", "Птицы", "Рыба")}
});
}

@Test
public void getFoodShouldReturnExpectedFood() throws Exception {
Animal animal = new Animal();
assertEquals(expectedFood, animal.getFood(animalKind));
}
}
34 changes: 34 additions & 0 deletions src/test/java/com/example/AnimalTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.example;

import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

public class AnimalTest {

@Test
public void getFoodShouldThrowForUnknownAnimalKind() {
Animal animal = new Animal();

try {
animal.getFood("Неизвестно");
fail("Expected exception");
} catch (Exception e) {
assertEquals(
"Неизвестный вид животного, используйте значение Травоядное или Хищник",
e.getMessage()
);
}
}

@Test
public void getFamilyShouldReturnAllFamilies() {
Animal animal = new Animal();

assertEquals(
"Существует несколько семейств: заячьи, беличьи, мышиные, кошачьи, псовые, медвежьи, куньи",
animal.getFamily()
);
}
}
51 changes: 51 additions & 0 deletions src/test/java/com/example/CatTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.List;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class CatTest {

@Mock
private Feline feline;

@Test
public void getSoundShouldReturnMeow() {
Cat cat = new Cat(feline);
assertEquals("Мяу", cat.getSound());
}

@Test
public void getFoodShouldDelegateToPredator() throws Exception {
when(feline.eatMeat()).thenReturn(List.of("Животные", "Птицы", "Рыба"));

Cat cat = new Cat(feline);
List<String> food = cat.getFood();

assertEquals(List.of("Животные", "Птицы", "Рыба"), food);
verify(feline, times(1)).eatMeat();
}

@Test
public void getFoodShouldThrowWhenPredatorThrows() throws Exception {
when(feline.eatMeat()).thenThrow(new Exception("boom"));

Cat cat = new Cat(feline);

try {
cat.getFood();
fail("Expected exception");
} catch (Exception e) {
assertEquals("boom", e.getMessage());
}

verify(feline, times(1)).eatMeat();
}
}
35 changes: 35 additions & 0 deletions src/test/java/com/example/FelineTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.example;

import org.junit.Test;

import java.util.List;

import static org.junit.Assert.assertEquals;

public class FelineTest {

@Test
public void eatMeatShouldReturnPredatorFood() throws Exception {
Feline feline = new Feline();
List<String> actual = feline.eatMeat();
assertEquals(List.of("Животные", "Птицы", "Рыба"), actual);
}

@Test
public void getFamilyShouldReturnCatsFamily() {
Feline feline = new Feline();
assertEquals("Кошачьи", feline.getFamily());
}

@Test
public void getKittensWithoutArgsShouldReturnOne() {
Feline feline = new Feline();
assertEquals(1, feline.getKittens());
}

@Test
public void getKittensWithArgsShouldReturnProvidedCount() {
Feline feline = new Feline();
assertEquals(5, feline.getKittens(5));
}
}
38 changes: 38 additions & 0 deletions src/test/java/com/example/LionSexParameterizedTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;

@RunWith(Parameterized.class)
public class LionSexParameterizedTest {

private final String sex;
private final boolean expectedHasMane;

public LionSexParameterizedTest(String sex, boolean expectedHasMane) {
this.sex = sex;
this.expectedHasMane = expectedHasMane;
}

@Parameterized.Parameters(name = "{index}: sex={0} -> mane={1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"Самец", true},
{"Самка", false}
});
}

@Test
public void doesHaveManeShouldMatchSex() throws Exception {
Feline feline = mock(Feline.class);
Lion lion = new Lion(sex, feline);
assertEquals(expectedHasMane, lion.doesHaveMane());
}
}
50 changes: 50 additions & 0 deletions src/test/java/com/example/LionTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.List;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class LionTest {

@Mock
private Feline feline;

@Test
public void constructorShouldThrowForUnknownSex() {
try {
new Lion("Неизвестно", feline);
fail("Expected exception");
} catch (Exception e) {
assertEquals("Используйте допустимые значения пола животного - самец или самка", e.getMessage());
}
}

@Test
public void getKittensShouldDelegateToFeline() throws Exception {
when(feline.getKittens()).thenReturn(3);

Lion lion = new Lion("Самец", feline);
int kittens = lion.getKittens();

assertEquals(3, kittens);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это нужно доработать:
для юнит-тестов применяется подход: один тест - одна проверка. В этом тесте две проверки, нужно оставить одну проверку.

В коде в нескольких местах есть по несколько проверок

verify(feline, times(1)).getKittens();
}

@Test
public void getFoodShouldDelegateToFeline() throws Exception {
when(feline.getFood("Хищник")).thenReturn(List.of("Животные", "Птицы", "Рыба"));

Lion lion = new Lion("Самка", feline);
List<String> food = lion.getFood();

assertEquals(List.of("Животные", "Птицы", "Рыба"), food);
verify(feline, times(1)).getFood("Хищник");
}
}
1 change: 1 addition & 0 deletions target/site/jacoco/com.example/Animal.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ru"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Animal</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">untitled</a> &gt; <a href="index.html" class="el_package">com.example</a> &gt; <span class="el_class">Animal</span></div><h1>Animal</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 27</td><td class="ctr2">100 %</td><td class="bar">0 of 4</td><td class="ctr2">100 %</td><td class="ctr1">0</td><td class="ctr2">5</td><td class="ctr1">0</td><td class="ctr2">7</td><td class="ctr1">0</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a2"><a href="Animal.java.html#L8" class="el_method">getFood(String)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="22" alt="22"/></td><td class="ctr2" id="c0">100 %</td><td class="bar" id="d0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="4" alt="4"/></td><td class="ctr2" id="e0">100 %</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">3</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">5</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a0"><a href="Animal.java.html#L5" class="el_method">Animal()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="16" height="10" title="3" alt="3"/></td><td class="ctr2" id="c1">100 %</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">0</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">0</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a1"><a href="Animal.java.html#L18" class="el_method">getFamily()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/greenbar.gif" width="10" height="10" title="2" alt="2"/></td><td class="ctr2" id="c2">100 %</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">0</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">0</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">0</td><td class="ctr2" id="k2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
21 changes: 21 additions & 0 deletions target/site/jacoco/com.example/Animal.java.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ru"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Animal.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">untitled</a> &gt; <a href="index.source.html" class="el_package">com.example</a> &gt; <span class="el_source">Animal.java</span></div><h1>Animal.java</h1><pre class="source lang-java linenums">package com.example;

import java.util.List;

<span class="fc" id="L5">public class Animal {</span>

public List&lt;String&gt; getFood(String animalKind) throws Exception {
<span class="fc bfc" id="L8" title="All 2 branches covered."> if (&quot;Травоядное&quot;.equals(animalKind)) {</span>
<span class="fc" id="L9"> return List.of(&quot;Трава&quot;, &quot;Различные растения&quot;);</span>
<span class="fc bfc" id="L10" title="All 2 branches covered."> } else if (&quot;Хищник&quot;.equals(animalKind)) {</span>
<span class="fc" id="L11"> return List.of(&quot;Животные&quot;, &quot;Птицы&quot;, &quot;Рыба&quot;);</span>
} else {
<span class="fc" id="L13"> throw new Exception(&quot;Неизвестный вид животного, используйте значение Травоядное или Хищник&quot;);</span>
}
}

public String getFamily() {
<span class="fc" id="L18"> return &quot;Существует несколько семейств: заячьи, беличьи, мышиные, кошачьи, псовые, медвежьи, куньи&quot;;</span>
}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
1 change: 1 addition & 0 deletions target/site/jacoco/com.example/Cat.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ru"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>Cat</title><script type="text/javascript" src="../jacoco-resources/sort.js"></script></head><body onload="initialSort(['breadcrumb'])"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">untitled</a> &gt; <a href="index.html" class="el_package">com.example</a> &gt; <span class="el_class">Cat</span></div><h1>Cat</h1><table class="coverage" cellspacing="0" id="coveragetable"><thead><tr><td class="sortable" id="a" onclick="toggleSort(this)">Element</td><td class="down sortable bar" id="b" onclick="toggleSort(this)">Missed Instructions</td><td class="sortable ctr2" id="c" onclick="toggleSort(this)">Cov.</td><td class="sortable bar" id="d" onclick="toggleSort(this)">Missed Branches</td><td class="sortable ctr2" id="e" onclick="toggleSort(this)">Cov.</td><td class="sortable ctr1" id="f" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="g" onclick="toggleSort(this)">Cxty</td><td class="sortable ctr1" id="h" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="i" onclick="toggleSort(this)">Lines</td><td class="sortable ctr1" id="j" onclick="toggleSort(this)">Missed</td><td class="sortable ctr2" id="k" onclick="toggleSort(this)">Methods</td></tr></thead><tfoot><tr><td>Total</td><td class="bar">0 of 12</td><td class="ctr2">100 %</td><td class="bar">0 of 0</td><td class="ctr2">n/a</td><td class="ctr1">0</td><td class="ctr2">3</td><td class="ctr1">0</td><td class="ctr2">5</td><td class="ctr1">0</td><td class="ctr2">3</td></tr></tfoot><tbody><tr><td id="a0"><a href="Cat.java.html#L9" class="el_method">Cat(Feline)</a></td><td class="bar" id="b0"><img src="../jacoco-resources/greenbar.gif" width="120" height="10" title="6" alt="6"/></td><td class="ctr2" id="c0">100 %</td><td class="bar" id="d0"/><td class="ctr2" id="e0">n/a</td><td class="ctr1" id="f0">0</td><td class="ctr2" id="g0">1</td><td class="ctr1" id="h0">0</td><td class="ctr2" id="i0">3</td><td class="ctr1" id="j0">0</td><td class="ctr2" id="k0">1</td></tr><tr><td id="a1"><a href="Cat.java.html#L18" class="el_method">getFood()</a></td><td class="bar" id="b1"><img src="../jacoco-resources/greenbar.gif" width="80" height="10" title="4" alt="4"/></td><td class="ctr2" id="c1">100 %</td><td class="bar" id="d1"/><td class="ctr2" id="e1">n/a</td><td class="ctr1" id="f1">0</td><td class="ctr2" id="g1">1</td><td class="ctr1" id="h1">0</td><td class="ctr2" id="i1">1</td><td class="ctr1" id="j1">0</td><td class="ctr2" id="k1">1</td></tr><tr><td id="a2"><a href="Cat.java.html#L14" class="el_method">getSound()</a></td><td class="bar" id="b2"><img src="../jacoco-resources/greenbar.gif" width="40" height="10" title="2" alt="2"/></td><td class="ctr2" id="c2">100 %</td><td class="bar" id="d2"/><td class="ctr2" id="e2">n/a</td><td class="ctr1" id="f2">0</td><td class="ctr2" id="g2">1</td><td class="ctr1" id="h2">0</td><td class="ctr2" id="i2">1</td><td class="ctr1" id="j2">0</td><td class="ctr2" id="k2">1</td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.12.202403310830</span></div></body></html>
Loading