В классе A вызов конструктора как этот
new A(someClass:mockedSomeClass)
работает нормально, потому что в groovy конструктор по умолчанию, который генерируется неявно, поддерживает установку значения любого поля с помощью , передавая именованный параметр , который поддерживается только в конструкторе по умолчанию. У вас было одно поле (someClass), которое вы прошли через конструктор, и все было в порядке.
Однако в классе B у вас есть явный конструктор с двумя аргументами. Обратите внимание, что вы можете вызывать этот конструктор только с этими двумя указанными аргументами (то есть int a, String b), так как он явно определен таким образом. Помните, что это не конструктор по умолчанию, как в классе A, поэтому он не поддерживает автоматическую установку поля путем передачи именованного параметра.
Короче говоря, чтобы это работало, вы должны явно указать и третий аргумент:
class B{
@Autowired
private SomeClass someClass;
public B(int a,String b, SomeClass someClass)
{
//method implementation
this.someClass = someClass;
}
И тогда вы можете назвать это так:
def b=new B(10, "g", mockedSomeClass)
Альтернативный подход :
Я бы предпочел подход сверху, так как он немного чище. Причина в том, что лучше иметь все обязательные зависимости в конструкторе, чтобы избежать путаницы.
Однако, если по какой-то причине вы не можете изменить исходный код Java, вы также можете решить эту проблему, создав объект следующим образом:
def b=new B(10, "g")
b.someClass = mockedSomeClass
В приведенном выше примере мы сначала создаем объект, вызывая явный конструктор класса B, который принимает 2 параметра. Затем мы устанавливаем поле someClass (это похоже на назначение частного поля вручную, но на самом деле мы устанавливаем его через установщик, который генерируется автоматически в groovy, о неявных получателях и установщиках можно прочитать здесь: http://groovy -lang.org / style-guide.html # _getters_and_setters ).