LINUX.ORG.RU

Тестирование методов класса

 ,


0

2

Привет всем!

В общем, есть у меня класс. В нем есть методы, какие-то из методов - закрытые(private), какие-то открытые(public). Хочу написать на методы класса тесты. Но! Как мне достучаться до private методов? С одной стороны, наверное, это и не нужно, хватит и тестов для public, если они отрабатывают верно - значит все ок. Но хочется мне узнать, возможно ли протестировать все методы класса, не взирая на ограничения.

Тесты пишу на ScalaTest, использую FlatSpec. Знаю, что можно сделать

private[package] def method
Но что-то мне не хочется юзать это в моем проблемном классе..

А может я вообще просто тупо загоняюсь и лучше забить?

В общем, хочется узнать, а как вы тестируетесь)

Всем заранее спасибо за участие!


Тестируются открытые методы. Если ты хочешь протестировать private-методы, возможно тебе стоит выделить этот функционал в отдельный класс.

Если сильно хочешь — можешь вызывать методы через reflection. Но это плохой вариант.

Legioner ★★★★★
()

По-хорошему никуда стучаться не надо. Раз private — значит, private. Я в таких случаях добавляю метод ...forTests, т.е. к private myMethod() приплюсовываю public myMethodForTests(), который вызывает все, что нужно.

Если хочется извратиться, всегда можно рефлекшеном пройтись. Пример на Java:

ToBeHacked.java

package test;

class ToBeHacked {
    private int x = 0;
    private int y = 0;

    private void prvt() {
        System.out.printf("Private %d, %d\n", x, y);
    }

    public void pblc() {
        System.out.printf("Public %d, %d\n", x, y);
    }
}

TestPrivate.java

package test;

import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestPrivate {

    @Test
    public void testPrivate() throws Exception {
        ToBeHacked toBeHacked = new ToBeHacked();

        // Открытый метод
        toBeHacked.pblc();

        // Закрытое поле
        Field x = toBeHacked.getClass().getDeclaredField("x");
        x.setAccessible(true);
        x.set(toBeHacked, 100);

        // Закрытый метод
        Method prvt = toBeHacked.getClass().getDeclaredMethod("prvt");
        prvt.setAccessible(true);

        prvt.invoke(toBeHacked);
    }
}
anonymous
()
Ответ на: комментарий от Debasher

Прямо в отдельный модуль проекта?А в чем преимущества перед выделением логики в отдельный класс?Или ты имел в виду именно в отдельный класс?

aarexer
() автор топика
Ответ на: комментарий от Legioner

Ну окей, например, выделяю тестируемый функционал в отдельный класс. Тестирую, все хорошо. Но вдруг кто-то или я меняет мои private методы в главном классе. Теперь надо переносить логику снова, так? По сути, это дублирование кода.

Reflection юзать не хочу, забыл написать в топике про него, даже не рассматривал как решение.

aarexer
() автор топика
Ответ на: комментарий от anonymous

Спасибо за совет и выкладку кода, но мне кажется все-таки добавлять в класс еще и ...ForTests() не очень хорошо. Лишний код, открывающий private методы.. Я не осуждаю, но мне лично не нравится этот вариант все-таки.. Но за опыт спасибо!

aarexer
() автор топика
Ответ на: комментарий от aarexer

Прямо в отдельный модуль проекта?А в чем преимущества перед выделением логики в отдельный класс?

Ну так банально логичнее. Можешь в класс, если у тебя классы как модули.

Debasher ★★★★★
()
Ответ на: комментарий от aarexer

Ну окей, например, выделяю тестируемый функционал в отдельный класс. Тестирую, все хорошо. Но вдруг кто-то или я меняет мои private методы в главном классе. Теперь надо переносить логику снова, так? По сути, это дублирование кода.

Предполагается, что ты используешь этот отдельный класс вместо своих приватных методов, конечно ничего дублировать не нужно.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.