diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java
new file mode 100644
index 0000000..ba0b175
--- /dev/null
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/CompanyServiceTest.java
@@ -0,0 +1,144 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.config.TestConfiguration;
+import org.eclipse.openk.contactbasedata.exceptions.NotFoundException;
+import org.eclipse.openk.contactbasedata.model.TblCompany;
+import org.eclipse.openk.contactbasedata.model.TblContact;
+import org.eclipse.openk.contactbasedata.repository.CompanyRepository;
+import org.eclipse.openk.contactbasedata.repository.ContactRepository;
+import org.eclipse.openk.contactbasedata.repository.PersonTypeRepository;
+import org.eclipse.openk.contactbasedata.repository.SalutationRepository;
+import org.eclipse.openk.contactbasedata.support.MockDataHelper;
+import org.eclipse.openk.contactbasedata.viewmodel.CompanyDto;
+import org.junit.jupiter.api.Test;
+import org.mockito.stubbing.Answer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.util.Optional;
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@DataJpaTest
+@ContextConfiguration(classes = {TestConfiguration.class})
+
+public class CompanyServiceTest {
+    @Qualifier("myCompanyService")
+    @Autowired
+    private CompanyService companyService;
+
+    @MockBean
+    private CompanyRepository companyRepository;
+
+    @MockBean
+    private ContactRepository contactRepository;
+
+    @MockBean
+    private SalutationRepository salutationRepository;
+
+    @MockBean
+    private PersonTypeRepository personTypeRepository;
+
+    @Test
+    public void shouldFindACompanyProperly() {
+        TblCompany ep = MockDataHelper.mockCompany();
+        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(ep));
+        CompanyDto dto = companyService.findCompany(UUID.randomUUID());
+
+        assertEquals(ep.getContact().getUuid(), dto.getContactUuid());
+    }
+
+    @Test
+    public void shouldThrowInErrorCaseWithCompany() {
+        TblCompany ep = MockDataHelper.mockCompany();
+        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
+        assertThrows(NotFoundException.class, () -> companyService.findCompany(UUID.randomUUID()));
+    }
+
+    @Test
+    public void shouldUpdateCompany() {
+        CompanyDto epDto = MockDataHelper.mockCompanyDto();
+        TblCompany epTbl = MockDataHelper.mockCompany();
+        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.of(epTbl));
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));
+
+        when(companyRepository.save(any(TblCompany.class)))
+                .then((Answer<TblCompany>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblCompany) args[0];
+                });
+
+        CompanyDto savedDto = companyService.updateCompany(epDto);
+        assertEquals(epTbl.getContact().getUuid(), savedDto.getContactUuid());
+        assertEquals(epTbl.getContact().getNote(), savedDto.getContactNote());
+        assertEquals(epTbl.getContact().getContactType(), savedDto.getContactType());
+        assertEquals(epTbl.getCompanyName(), savedDto.getCompanyName());
+        assertEquals(epTbl.getCompanyType(), savedDto.getCompanyType());
+    }
+
+    @Test
+    public void shouldNotUpdateCompany_Exception1() {
+        CompanyDto epDto = MockDataHelper.mockCompanyDto();
+        TblCompany epTbl = MockDataHelper.mockCompany();
+        when(companyRepository.findByTblContactUuid(any(UUID.class))).thenReturn(Optional.empty());
+        when(salutationRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefSalutation()));
+        when(personTypeRepository.findByUuid(any(UUID.class)))
+                .thenReturn(Optional.of(MockDataHelper.mockRefPersonType()));
+
+        when(companyRepository.save(any(TblCompany.class)))
+                .then((Answer<TblCompany>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblCompany) args[0];
+                });
+
+        assertThrows( NotFoundException.class, () -> companyService.updateCompany(epDto));
+    }
+
+    @Test
+    public void shouldInsertCompany() {
+        CompanyDto epDto = MockDataHelper.mockCompanyDto();
+        epDto.setContactUuid(null);
+
+        when(contactRepository.save(any(TblContact.class)))
+                .then((Answer<TblContact>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblContact) args[0];
+                });
+        when(companyRepository.save(any(TblCompany.class)))
+                .then((Answer<TblCompany>) invocation -> {
+                    Object[] args = invocation.getArguments();
+                    return (TblCompany) args[0];
+                });
+
+        CompanyDto savedDto = companyService.insertCompany(epDto);
+        assertNotNull(savedDto.getContactUuid());
+        assertEquals(epDto.getContactNote(), savedDto.getContactNote());
+        assertEquals(epDto.getContactType(), savedDto.getContactType());
+        assertEquals(epDto.getCompanyName(), savedDto.getCompanyName());
+        assertEquals(epDto.getCompanyType(), savedDto.getCompanyType());
+    }
+}
\ No newline at end of file
