1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.testsupport.mocking;
7   
8   import static org.mockito.Mockito.withSettings;
9   
10  import org.mockito.Answers;
11  import org.mockito.Mockito;
12  
13  import java.util.UUID;
14  
15  import dev.metaschema.core.util.ObjectUtils;
16  import edu.umd.cs.findbugs.annotations.NonNull;
17  import edu.umd.cs.findbugs.annotations.Nullable;
18  
19  /**
20   * A mocking factory that uses Mockito to produce mock objects with
21   * CALLS_REAL_METHODS as the default answer behavior.
22   */
23  public class AbstractMockitoFactory
24      implements IMockFactory {
25  
26    /**
27     * Protected constructor to enforce the factory pattern.
28     * <p>
29     * Subclasses should provide specific factory methods for creating domain
30     * objects.
31     */
32    protected AbstractMockitoFactory() {
33      // allow construction by extending classes
34    }
35  
36    @Override
37    @NonNull
38    public <T> T mock(@NonNull Class<T> clazz, @Nullable String name) {
39      StringBuilder builder = new StringBuilder()
40          .append(clazz.getSimpleName());
41      if (name != null) {
42        builder
43            .append('-')
44            .append(name);
45      }
46      builder
47          .append('-')
48          .append(UUID.randomUUID().toString())
49          .toString();
50      return ObjectUtils.notNull(Mockito.mock(clazz, withSettings()
51          .name(builder.toString())
52          .defaultAnswer(Answers.CALLS_REAL_METHODS)));
53    }
54  }