2015-04-19 3 views
0

Мне нужно проверить свойство, которое содержит частный val, но этот val должен быть переопределен для тестирования.Можно переопределить частный val в scala trait

trait A { 
    private val someVariable = 0 
} 

тестовый класс

@RunWith(classOf[JUnitRunner]) class ATest extends FunSuite { 
    val a = new A{ 
    override private val someVariable = 1 
    } 

    test("test of someVariable){ 
    assert(a.someVariable == 1) //I know that I can't print private variable in this way, but it is just for showing what I need. 
    } 

} 

ли здесь какой-то способ, как переопределить эту переменную? Благодаря

+0

Почему бы не определить его как 'protected'? – Odomontois

+0

Я не могу изменить инкапсуляцию. – franki3xe

ответ

0

Я изменил мою черту на

trait A { 
    private[package] val someVariable = 0 
} 

Теперь он работает.

+0

Зачем комментировать, что вы не можете изменить инкапсуляцию, когда это было тем, что вы закончили? –

1

Черта инициализатору также необходимо установить это поле, так что вы можете использовать этот общественный синтетический сеттер:

scala> :pa -raw 
// Entering paste mode (ctrl-D to finish) 

package XX { trait X { private val x = 42 ; def test = x * 2 } } 

// Exiting paste mode, now interpreting. 


scala> (new XX.X {}).test 
res0: Int = 84 

scala> val v = new XX.X {} 
v: XX.X = [email protected] 

scala> classOf[XX.X].getDeclaredMethod("XX$X$_setter_$XX$X$$x_$eq", classOf[Int]) 
res1: java.lang.reflect.Method = public abstract void XX.X.XX$X$_setter_$XX$X$$x_$eq(int) 

scala> res1.invoke(v, 3: Integer) 
res2: Object = null 

scala> v.test 
res3: Int = 6 

Там больше чем один способ рефлекторно кожи кошки.

+0

Это не полезно, если значение используется с нетерпением во время инициализации. –

Смежные вопросы