Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для moramar
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 42

JUnit тесты

21.09.2016, 17:56. Показов 1697. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, знатоки.
Написал незамысловатый код по заданию, заказчик просит юнит тесты. Вот код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class WelcomeMessage {
    private static Logger log = Logger.getLogger(WelcomeMessage.class.getName());
 
    public static void main(String[] args) {
        log.info("Greeting message.");
        System.out.println("hey");
        System.out.println(setMessage()+" "+setTime());
    }
    public static String setPartOfDay(){
        int hour = Calendar.HOUR_OF_DAY;
        log.info("Identified part of a day.");
        if (hour < 6) return "night";
        else if (hour < 9) return "morning";
        else if (hour < 19) return "day";
        else return "evening";
    }
    public static String setMessage(){
        ResourceBundle resourceBundle = ResourceBundle.getBundle("message", Locale.getDefault());
        log.info("Choose a message.");
        return resourceBundle.getString(setPartOfDay());
    }
    public static String setTime(){
        DateFormat format= new SimpleDateFormat("HH:mm");
        Date date = new Date();
        log.info("Set format for time and time itself.");
        return format.format(date);
    }
}
Вот первая попытка написать тесты, которая неудовлитворила заказчика.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class WelcomeMessageTest {
    @org.junit.Test
    public void setPartOfDay() throws Exception {
        WelcomeMessage test = new WelcomeMessage();
        assertThat(test.setPartOfDay(), isA(String.class));
    }
    @org.junit.Test
    public void setMessage() throws Exception {
        WelcomeMessage test = new WelcomeMessage();
        String text = "Hello bro!";
        assertNotEquals(text, test.setMessage());
    }
    @org.junit.Test
    public void setTime() throws Exception {
        WelcomeMessage test = new WelcomeMessage();
        String text = new SimpleDateFormat("HH:mm").format(new Date());
        assertEquals(text,test.setTime());
    }
}
Я понимаю так: при написании теста нужно знать заранее ответ какой выдаст метод. Но как можно узнать ответ к методу который работает в зависимости от времени суток? Помогите понять, пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.09.2016, 17:56
Ответы с готовыми решениями:

Junit and Mockito тесты
Добрый день Мне тут задали некоторое небольшое задание сделать. Почти сделел только остались тесты. Но мне нужен взгляд со...

JUnit тесты. Параметры в тестовом методе
Задача примерно следующуая. Предположим я написал функцию, которая тестирует класс с параметром конструктора 1000. То есть RandomFix...

JUnit. Как написать тесты, работающие с БД
Добрый день. Подскажите пожалуйста как правильно писать юнит тесты для методов которые открывают и закрывают конекшн к базе данных. ...

7
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
21.09.2016, 20:16
moramar, один вариант - добавить дополнительный конструктор в класс который будет брать Calendar. А в тестах делать mock.
И тесты должны называться чтобы понятно что тестируется, а не название метода которое тестируется - returnsMorningWhenHourLessThan9 например.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
21.09.2016, 20:35
Цитата Сообщение от moramar Посмотреть сообщение
Java
1
2
3
4
5
6
int hour = Calendar.HOUR_OF_DAY;
* * * * log.info("Identified part of a day.");
* * * * if (hour < 6) return "night";
* * * * else if (hour < 9) return "morning";
* * * * else if (hour < 19) return "day";
* * * * else return "evening";
Абсолютно не верно:
/**
* Field number for <code>get</code> and <code>set</code> indicating the
* hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
* E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
*
* @see #HOUR
*/
public final static int HOUR_OF_DAY = 11;
Применяются эти константы следующим образом:
Java
1
2
3
4
5
        // сейчас 22 часа
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
        calendar.set(Calendar.HOUR_OF_DAY, 9);
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
Вывод в консоль:
22
9
Добавлено через 8 минут
moramar, разберись с get/set методами. В тестах тебе не надо создавать экземпляр WelcomeMessage, т.к. все методы статические.

Если хочешь реально что-то тестировать, то переписывай класс без статиков, по крайней мере setMessage(), ResourceBundle получай не внутри метода, а передавай в объект, например в main. тогда в тестах у тебя будет возможность передать такой ResourceBundle, который будет возвращать информацию, которую ты ожидаешь
0
 Аватар для moramar
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 42
22.09.2016, 12:08  [ТС]
Цитата Сообщение от LeX BB Посмотреть сообщение
ResourceBundle получай не внутри метода, а передавай в объект, например в main. тогда в тестах у тебя будет возможность передать такой ResourceBundle, который будет возвращать информацию, которую ты ожидаешь
можно пример пожалуйста?
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
22.09.2016, 15:28
Цитата Сообщение от moramar Посмотреть сообщение
Но как можно узнать ответ к методу который работает в зависимости от времени суток?
Создай метод, который возвращает текущее время и используй его. А в тестах его замокай.
0
 Аватар для moramar
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 42
23.09.2016, 15:47  [ТС]
Цитата Сообщение от KuKu Посмотреть сообщение
Создай метод, который возвращает текущее время и используй его. А в тестах его замокай.
а метод setTime чем плох? И я пол дня читал про этот мок и пытался понять как его применить в моей ситуации так и не смог.. Обьясните как-то по человечески пожалуйста.
0
 Аватар для KuKu
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
23.09.2016, 22:49
Цитата Сообщение от moramar Посмотреть сообщение
а метод setTime чем плох?
а что он полезного делает?
Мок подменяет результат метода на нужный. К примеру, чтобы тесты не зависили от текущего времени. В текущую дату подкладываем то значение, с которым хотим протестировать.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
 
/**
 * @since 24.09.2016
 */
public class WelcomeMessage {
    public Date getCurrentDate() {
        return new Date();
    }
 
    public String getPartOfDay() {
        Date currentDate = getCurrentDate();
 
        Calendar calendar = GregorianCalendar.getInstance();
        calendar.setTime(currentDate);
 
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
 
        if (hour < 6) {
            return "night";
        } else if (hour < 9) {
            return "morning";
        } else if (hour < 19) {
            return "day";
        } else {
            return "evening";
        }
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import org.junit.Assert;
import org.junit.Test;
 
import java.text.SimpleDateFormat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
 
/**
 * @since 24.09.2016
 */
public class WelcomeMessageTest {
 
    private final static SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
 
    @Test
    public void getPartOfDayTest() throws Exception {
        WelcomeMessage welcomeMessage = spy(new WelcomeMessage());
 
        when(welcomeMessage.getCurrentDate()).thenReturn(dateFormat.parse("10.10.2010 00:00:00"));
        Assert.assertEquals("night", welcomeMessage.getPartOfDay());
 
        when(welcomeMessage.getCurrentDate()).thenReturn(dateFormat.parse("10.10.2010 10:00:00"));
        Assert.assertEquals("day", welcomeMessage.getPartOfDay());
 
        when(welcomeMessage.getCurrentDate()).thenReturn(dateFormat.parse("10.10.2010 21:00:00"));
        Assert.assertEquals("evening", welcomeMessage.getPartOfDay());
    }
}
1
 Аватар для moramar
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 42
24.09.2016, 22:36  [ТС]
KuKu, спасибо за наглядный пример, я вроде понял что вы сделали, но вот в целом по мокито все равно не ясно, что, к чему, как и т.п...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2016, 22:36
Помогаю со студенческими работами здесь

Junit тесты: как правильно реализовать проверку метода findAll?
Доброго времени суток, форумчане. Подскажите пожалуйста, как правильно реализовать проверку метода findAll() в junit-тестах?

JUnit тесты
Мне нужно сделать тесты к проекту, собранному в Maven. Не понимаю, как создать тест. У меня в программе реализуется модуль .jar, который...

JUnit
Помогите протестировать исключения public static String readLines(String file) { StringBuilder res = new StringBuilder(); ...

тестирование с JUnit
Откуда вот такая ошибка??: .E Time: 0 There was 1 error: 1) testAge(TestClass) at Main.main(Main.java:7) FAILURES!!! Tests...

Тестирование в JUnit
Здравствуйте, требуется проверить значения матрицы на принадлежность диапазону, т.е. получить ошибку Error 500 . Я не знаю как имитировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru