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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.